HTTPS已经成为当今网站的标准配置,为网站提供加密和身份验证功能。但是申请和维护SSL证书一直是一个繁琐的过程。幸运的是,Lego这个强大的工具可以帮助我们轻松地自动化获取和更新Let’s Encrypt免费SSL证书。

Lego 简介

Lego是一个用Go语言编写的Let’s Encrypt客户端,它可以帮助我们自动化完成SSL证书的申请、验证和更新过程。相比于其他工具,Lego的优势在于:

  • 支持多种验证方式,包括HTTP和DNS验证
  • 集成了众多DNS服务商的API,可以自动完成DNS验证
  • 使用简单,只需几个命令即可完成证书申请
  • 支持通配符证书

安装 Lego

  • mac
1
brew install lego
  • docker
1
docker run goacme/lego -h

签发rout53证书

  1. 配置AWS密钥
1
2
3
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_REGION=us-east-1
  1. 生成ssl证书
1
lego --email xhuaustc@gmail.com --domains jenkins.douhua.com --dns route53 --accept-tos --dns.disable-cp  --path ~/.lego/jenkins run

证书将保存在 ~/.lego/jenkins 目录下。

  • 其中email用来接收证书快过期时的提示
  • lego支持多种dns provider, 如:阿里云,腾讯云,Route53等
  • 对于不同的证书,需要指定不同的path目录
  1. 可生成泛域名证书,以腾讯云为例
1
2
3
export TENCENTCLOUD_SECRET_ID=your_secret_id
export TENCENTCLOUD_SECRET_KEY=your_secret_key
lego --email xhuaustc@gmail.com --domains douhua.com --domains *.douhua.com --dns tencentcloud --accept-tos --dns.disable-cp --path ~/.lego/tencent/jenkins run

对于一些java应用需要jks证书

  1. 将ssl证书转为jks
1
2
openssl pkcs12 -export -in domain.crt -inkey domain.key -out certificate.p12 -name jenkins
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype PKCS12 -destkeystore jenkins.douhua.com.jks -deststoretype JKS

过程中需要输入密码。密码也可以通过命令行指定

1
2
openssl pkcs12 -export -in domain.crt -inkey domain.key -out certificate.p12 -name "jenkins" -password pass:yourpassword
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype PKCS12 -destkeystore jenkins.douhua.com.jks -deststoretype JKS -srcstorepass yourpassword -deststorepass yourpassword
  1. 验证jks
1
keytool -list -v -keystore jenkins.douhua.com.jks
  1. jenkins中配置证书
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cat /etc/jenkins/jenkins.conf
JENKINS_WAR=/opt/jenkins/jenkins.war

JENKINS_HOME=/opt/jenkins/data

JAVA_ARGS="-Djava.awt.headless=true \
-Djava.net.preferIPv4Stack=true \
-XX:+AlwaysPreTouch \
-XX:+UseG1GC \
-Xms8192m \
-Xmx8192m \
-Xss127m \
-Xlog:gc*=debug:file=gclog.log:utctime,level,tags:filecount=9,filesize=1M"

JENKINS_ARGS="--httpPort=-1 --httpsPort=8800 --logfile=/var/log/jenkins/jenkins.log \
--httpsKeyStore=/opt/jenkins/jenkins.douhua.com.jks \
--httpsKeyStorePassword=xxxxxx \
--useJmx"

$ /usr/bin/java $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS

更新route53证书

当证书有效期在30天以内,可以使用renew更新证书

1
lego --email xhuaustc@gmail.com --domains jenkins.douhua.com --dns route53 --accept-tos --dns.disable-cp  --path ~/.lego/jenkins renew