免费的只能在网页上手动验证而且只能签3张90天的,官方在订阅里写免费账号不能用rest api,我就另外注册了个免费账号测试了一下确实不行,至少需要10美元/月或96美元/年,如果认为这个价格可以接受才能用这个方法。或者也可以找我来签发,我只收一点费用,联系方式在右上角。
域名证书没有必要用这个方法,包括通配符证书用acme协议的话,zerossl都是可以免费且基本没有限制来签发的,ip证书用不了acme才用rest api。
只签1个ip这个价格是偏贵的,1个1年的ip证书大概就一两百人民币。
ip证书的用处我就不多说了,肯定有需求才会来看怎么弄ip证书,我是因为向纯ip发client hello里没有servername,所以比较喜欢用。
只能签ipv4证书是因为ipv6当url要加[](比如https://[2606:4700:4700::1111],cloudflare的网站放心点),我用网页创建证书可以写ipv6而且zerossl也能识别,但是验证url没有[],所以验证不了。
用了这个项目zerossl-ip-cert,里面有caddy-windows和nginx-linux示例,在releases里下载对应版本的可执行文件,我以caddy为例,分别在两个平台各给出两个方法来完成验证。
假设程序自身的yaml配置文件名是config.yaml,这个文件只需要改第6行的ip和第10行的api就可以了,api可以在这个网页查,注释我懒得翻译了,这些在证书里都是很常见的名词看不懂的我觉得也没有必要去改,这是比较好的配置,除了国家是中国其他没有包含识别性的信息,可以使用相对路径,我的配置无论是哪种操作系统caddy可执行文件都应该在系统环境变量path中,不在的话注意一下脚本文件不一定能用。
windows
dataDir: .\zerossl # Data directory for containing the status and temporary files
logFile: .\log.txt # Log file
cleanUnfinished: false # Clean zerossl certificates that are not finished issuing.
certConfigs:
# Use confId to identify the certificate configuration
- commonName: 1.1.1.1
# mandatory
confId: 001
# your zerossl api key
apiKey: xxxxxxxxxxxxxxxxxxxxx
######## CSR INFO ########
country: CN
province: "*"
city: "*"
locality:
organization:
organizationUnit:
######## CSR INFO ########
# certificate validity in days
days: 90
# key type, ecdsa or rsa
keyType: ecdsa
# ecdsa curve, P-256 or P-384
keyCurve: P-384
# signature algorithm, ECDSA-SHA256 or SHA256-RSA or ECDSA-SHA384 or SHA384-RSA
sigAlg: ECDSA-SHA384
# fixed
strictDomains: 1
# fixed
verifyMethod: HTTP_CSR_HASH
# verify hook executable, will be called before verifying domains
verifyHook: .\caddy-verify-hook.cmd
# post hook executable, will be called after certificates arrival
postHook: .\caddy-post-hook.cmd
# certificate store path
certFile: .\fullchain.crt
# key store path
keyFile: .\privkey.keyYAML两种方法验证,需要创建caddy-verify-hook.cmd和caddy-post-hook.cmd文件,然后修改他们
第一种方法用caddy本身对特定路径做出特定响应,这也是项目中的示例
@echo off
SETLOCAL
echo "ZEROSSL_HTTP_FV_HOST: %ZEROSSL_HTTP_FV_HOST%"
echo "ZEROSSL_HTTP_FV_PATH: %ZEROSSL_HTTP_FV_PATH%"
echo "ZEROSSL_HTTP_FV_PORT: %ZEROSSL_HTTP_FV_PORT%"
echo "ZEROSSL_HTTP_FV_CONTENT: %ZEROSSL_HTTP_FV_CONTENT%"
set VF_FILE="C:\zerossl\Caddyfile"
echo :%ZEROSSL_HTTP_FV_PORT% {> %VF_FILE%
echo respond %ZEROSSL_HTTP_FV_PATH% 200 {>> %VF_FILE%
REM CONTENT
set TMP_VF_CNTENT=%ZEROSSL_HTTP_FV_CONTENT%
set "IF_FIRSTLN=1"
:loop
for /f "tokens=1*" %%a in ("%TMP_VF_CNTENT%") do (
set TMP_VF_CNTENT=%%b
if %IF_FIRSTLN% == 1 (
echo FIRST LINE %%a
echo body ^"%%a>> %VF_FILE%
set "IF_FIRSTLN=0"
) else (
echo OTHER LINE %%a
echo %%a>> %VF_FILE%
)
)
if defined TMP_VF_CNTENT goto :loop
echo ^">> %VF_FILE%
echo }>> %VF_FILE%
echo }>> %VF_FILE%
ENDLOCAL
CD /d C:\zerossl
@echo on
caddy.exe validate
caddy.exe reloadBAT (Batchfile)@echo off
CD /d C:\caddy
@echo on
caddy.exe validate
caddy.exe reloadBAT (Batchfile)该方法中caddy-verify-hook.cmd需要修改第10和第38行,这个是用来验证的路径,不改也可以,就是找个自己喜欢的路径,caddy-post-hook.cmd是用来恢复caddy服务的,所以第3行的路径应该修改为本身提供web服务的路径然后恢复web服务,可以以喜欢的形式恢复,不一定非得用这个方法。
此方法会在验证结束前中断web服务,但是不需要对原本的配置文件作出任何更改。
第二种方法用创建文件的方式来验证,需要修改Caddyfile配置文件,这段配置最好放在全局选项后的第一个块,不应该放在最后
:80 {
root * C:\caddy\ssl
file_server
}Caddyfile第2行应该修改为你指定的根目录,需要在第2行的中指定的根目录中创建文件夹.well-known,在.well-known中再创建文件夹pki-validation
@echo off
SETLOCAL
echo "ZEROSSL_HTTP_FV_HOST: %ZEROSSL_HTTP_FV_HOST%"
echo "ZEROSSL_HTTP_FV_PATH: %ZEROSSL_HTTP_FV_PATH%"
echo "ZEROSSL_HTTP_FV_PORT: %ZEROSSL_HTTP_FV_PORT%"
echo "ZEROSSL_HTTP_FV_CONTENT: %ZEROSSL_HTTP_FV_CONTENT%"
set PATH=%ZEROSSL_HTTP_FV_PATH:/=\%
set VF_FILE="C:\caddy\ssl%PATH%"
REM CONTENT
set TMP_VF_CNTENT=%ZEROSSL_HTTP_FV_CONTENT%
set "IF_FIRSTLN=1"
:loop
for /f "tokens=1*" %%a in ("%TMP_VF_CNTENT%") do (
set TMP_VF_CNTENT=%%b
if %IF_FIRSTLN% == 1 (
echo FIRST LINE %%a
echo %%a>> %VF_FILE%
set "IF_FIRSTLN=0"
) else (
echo OTHER LINE %%a
echo %%a>> %VF_FILE%
)
)
if defined TMP_VF_CNTENT goto :loop
ENDLOCALBAT (Batchfile)@echo off
del /Q C:\caddy\ssl\.well-known\pki-validation\*
CD /d C:\caddy
@echo on
caddy.exe stop
caddy.exe startBAT (Batchfile)该方法应该修改caddy-verify-hook中第12行为你的caddy中root的根目录的路径,修改caddy-post-hook.cmd第3行为验证文件的路径,但这不是必须的,会残留文件,到时候手动删除也可以,后面几行是为了重载caddy来读取新证书文件,如果caddy被做成服务,那运行zerossl-ip-cert.exe时就应该用管理员权限运行,可caddy-post-hook.cmd中重启caddy的命令(4-7行)改为net stop caddy & net start caddy之类的来重启服务。
这个方法在验证过程中不会对原本的web服务有任何的干扰,但是需要修改原本的配置文件。
这些文件和zerossl-ip-cert.exe放在同一目录,此时应该有4个文件,进入目录,然后执行zerossl-ip-cert -config config.yaml,证书就会生成在配置文件中certFile和keyFile指定的位置
linux
caddy在linux有官方的安装脚本,我以官方安装完caddy的状态来编写配置
dataDir: ./zerossl # Data directory for containing the status and temporary files
logFile: ./log.txt # Log file
cleanUnfinished: true # Clean zerossl certificates that are not finished issuing.
certConfigs:
# Use confId to identify the certificate configuration
- commonName: 1.1.1.1
# mandatory
confId: 001
# your zerossl api key
apiKey: xxxxxxxxxxxxxxxxxxxx
######## CSR INFO ########
country: CN
province: "*"
city: "*"
locality:
organization:
organizationUnit:
######## CSR INFO ########
# certificate validity in days
days: 90
# key type, ecdsa or rsa
keyType: ecdsa
# ecdsa curve, P-256 or P-384
keyCurve: P-384
# signature algorithm, ECDSA-SHA256 or SHA256-RSA or ECDSA-SHA384 or SHA384-RSA
sigAlg: ECDSA-SHA384
# fixed
strictDomains: 1
# fixed
verifyMethod: HTTP_CSR_HASH
# verify hook executable, will be called before verifying domains
verifyHook: ./caddy-verify-hook.sh
# post hook executable, will be called after certificates arrival
postHook: ./caddy-post-hook.sh
# certificate store path
certFile: /etc/caddy/fullchain.crt
# key store path
keyFile: /etc/caddy/privkey.keyYAML同样需要创建caddy-verify-hook.cmd和caddy-post-hook.cmd文件,然后修改他们
第一种方法依旧会中断web服务直到验证完成,我直接用root运行的,至少需要sudo权限。
#!/usr/bin/env bash
echo "caddy verify hook running"
echo "ZEROSSL_HTTP_FV_HOST: $ZEROSSL_HTTP_FV_HOST"
echo "ZEROSSL_HTTP_FV_PATH: $ZEROSSL_HTTP_FV_PATH"
echo "ZEROSSL_HTTP_FV_PORT: $ZEROSSL_HTTP_FV_PORT"
echo "ZEROSSL_HTTP_FV_CONTENT: $ZEROSSL_HTTP_FV_CONTENT"
VF_FILE="/root/zerossl/Caddyfile"
cat <<EOF > $VF_FILE
:$ZEROSSL_HTTP_FV_PORT {
respond $ZEROSSL_HTTP_FV_PATH 200 {
body "$ZEROSSL_HTTP_FV_CONTENT"
}
}
EOF
cd /root/zerossl
caddy validate
caddy reloadShellScript#!/usr/bin/env bash
sudo systemctl restart caddyShellScript第二种方法依旧需要修改Caddyfile配置文件,但不会中断web服务
:80 {
root * /etc/caddy/ssl
file_server
}Caddyfile也需要在第2行指定的根目录中创建文件夹.well-known,在.well-known中再创建文件夹pki-validation
#!/usr/bin/env bash
echo "caddy verify hook running"
echo "ZEROSSL_HTTP_FV_HOST: $ZEROSSL_HTTP_FV_HOST"
echo "ZEROSSL_HTTP_FV_PATH: $ZEROSSL_HTTP_FV_PATH"
echo "ZEROSSL_HTTP_FV_PORT: $ZEROSSL_HTTP_FV_PORT"
echo "ZEROSSL_HTTP_FV_CONTENT: $ZEROSSL_HTTP_FV_CONTENT"
VF_FILE="/etc/caddy/ssl"
cat <<EOF > $VF_FILE$ZEROSSL_HTTP_FV_PATH
$ZEROSSL_HTTP_FV_CONTENT
EOFShellScript#!/usr/bin/env bash
rm /etc/caddy/ssl/.well-known/pki-validation/*
sudo systemctl restart caddyShellScript需要修改caddy-verify-hook.sh中第10行和Caddyfile中的root目录一致,修改caddy-post-hook.sh前半路径中和Caddyfile中的root目录一致,同样可以不写,只是会残留文件而已,后面1行是为了重载caddy来读取新证书文件,至少需要sudo权限。
这些文件和zerossl-ip-cert放在同一目录,此时应该有4个文件,进入目录,然后执行./zzerossl-ip-cert -config ./config.yaml,证书就会生成在配置文件中certFile和keyFile指定的位置。
然后windows或linux弄个计划任务/cron定期执行一下.cmd/.sh脚本就可以了。
第一种方法适合服务器刚上线、批量部署、短期使用,改个ip直接运行就完事了,第二种适合需要长期使用这个ip,以及已经部署服务不希望有任何中断的。
如果是nginx或者其他任何web服务器用第二种方法只要把路径改一改,其他所有东西都可以不动,其实就和手动下载txt文件放到指定文件夹里等验证完再删掉是一样的,第一种方法就比较麻烦,caddy和其他web服务器的配置文件在换行的处理上应该是不一样的,