自动申请/续签zerossl纯ipv4证书

免费的只能在网页上手动验证而且只能签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

config.yaml
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.key
YAML

两种方法验证,需要创建caddy-verify-hook.cmd和caddy-post-hook.cmd文件,然后修改他们

第一种方法用caddy本身对特定路径做出特定响应,这也是项目中的示例

caddy-verify-hook.cmd
@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 reload
BAT (Batchfile)
caddy-post-hook.cmd
@echo off

CD /d C:\caddy
@echo on
caddy.exe validate
caddy.exe reload
BAT (Batchfile)

该方法中caddy-verify-hook.cmd需要修改第10和第38行,这个是用来验证的路径,不改也可以,就是找个自己喜欢的路径,caddy-post-hook.cmd是用来恢复caddy服务的,所以第3行的路径应该修改为本身提供web服务的路径然后恢复web服务,可以以喜欢的形式恢复,不一定非得用这个方法。

此方法会在验证结束前中断web服务,但是不需要对原本的配置文件作出任何更改。

第二种方法用创建文件的方式来验证,需要修改Caddyfile配置文件,这段配置最好放在全局选项后的第一个块,不应该放在最后

Caddyfile
:80 {
	root * C:\caddy\ssl
	file_server
}
Caddyfile

第2行应该修改为你指定的根目录,需要在第2行的中指定的根目录中创建文件夹.well-known,在.well-known中再创建文件夹pki-validation

caddy-verify-hook.cmd
@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

ENDLOCAL
BAT (Batchfile)
caddy-post-hook.cmd
@echo off

del /Q C:\caddy\ssl\.well-known\pki-validation\*
CD /d C:\caddy
@echo on
caddy.exe stop
caddy.exe start
BAT (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的状态来编写配置

config.yaml
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.key
YAML

同样需要创建caddy-verify-hook.cmd和caddy-post-hook.cmd文件,然后修改他们

第一种方法依旧会中断web服务直到验证完成,我直接用root运行的,至少需要sudo权限。

caddy-verify-hook.sh
#!/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 reload
ShellScript
caddy-post-hook.sh
#!/usr/bin/env bash

sudo systemctl restart caddy
ShellScript

第二种方法依旧需要修改Caddyfile配置文件,但不会中断web服务

Caddyfile
:80 {
	root * /etc/caddy/ssl
	file_server
}
Caddyfile

也需要在第2行指定的根目录中创建文件夹.well-known,在.well-known中再创建文件夹pki-validation

caddy-verify-hook.sh
#!/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
EOF
ShellScript
caddy-post-hook.sh
#!/usr/bin/env bash

rm /etc/caddy/ssl/.well-known/pki-validation/*
sudo systemctl restart caddy
ShellScript

需要修改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服务器的配置文件在换行的处理上应该是不一样的,

文章已创建 33

发表评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部

了解 njj's blog 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读

了解 njj's blog 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读