Skip to content

首先安装 OpenSSL

shell
openssl genrsa -passout pass:111111 -des3 -out ca.key 4096
openssl req -passin pass:111111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/CN=localhost"
openssl genrsa -passout pass:111111 -des3 -out server.key 4096
openssl req -passin pass:111111 -new -key server.key -out server.csr -subj "/CN=localhost"
openssl x509 -req -passin pass:111111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
openssl rsa -passin pass:111111 -in server.key -out server.key
openssl genrsa -passout pass:111111 -des3 -out client.key 4096
openssl req -passin pass:111111 -new -key client.key -out client.csr -subj "/CN=localhost"
openssl x509 -passin pass:111111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
openssl rsa -passin pass:111111 -in client.key -out client.key
openssl pkcs8 -topk8 -nocrypt -in client.key -out client.pem
openssl pkcs8 -topk8 -nocrypt -in server.key -out server.pem
  • 密钥和证书

上述代码中,ca.cert和server.pem/server.cert是通过openssl生成的密钥和证书,生成的脚本可以直接参考项目中的readme文档。

值得注意的是,按照readme中的脚本,只能生成一个指定了域名的证书(localhost),假使我们想通过多个域名甚至多个IP来访问服务(后端做负载均衡和服务发现),这样生成的证书就不合用了,访问时会抛异常。因此修改了脚本,下面脚本仅做记录使用。

shell
openssl genrsa -passout pass:1111 -des3 -out ca.key 1024
openssl req -passin pass:1111 -new -x509 -days 7300 -key ca.key -out ca.crt -subj "/C=CN/ST=GuangDong/CN=www.ido.com" -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:www.ido.com,IP:127.0.0.1,IP:180.137.128.151"))
openssl genrsa -passout pass:1111 -des3 -out server.key 1024
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=CN/ST=GuangDong/CN=www.ido.com" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:www.ido.com,IP:127.0.0.1,IP:180.137.128.151"))
# 以下这句是grpc官方例子中生成crt文件的命令,但发现这种方式无法指定ip和多域名,因此弃用
# openssl x509 -req -passin pass:1111 -days 7300 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt 
openssl ca -passin pass:1111 -days 7300 -in server.csr -keyfile ca.key -cert ca.crt -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:www.ido.com,IP:127.0.0.1,IP:180.137.128.151"))
openssl rsa -passin pass:1111 -in server.key -out server.key
openssl pkcs8 -topk8 -nocrypt -in server.key -out server.pem

这样生成的证书,经过测试,可以部署在多个IP(这里是127.0.0.1和180.137.128.151)服务器上,正常访问。

字段 字段含义 示例

/C= Country 国家 CN

/ST= State or Province 省 Beijing

/L= Location or City 城市 Shanghai

/O= Organization 组织或企业 mengmei

/OU= Organization Unit 部门 dev

/CN= Common Name 域名或IP localhost

certbot 安装

shell
sudo pip install certbot==0.40.0
sudo pip install acme==0.40.0
sudo pip install six

sudo certbot certonly --standalone -d example.com -d sub.example.com
# 生成的证书在 /etc/letsencrypt/live/example.com/ 目录下
# Java 使用 pkcs12 格式, Tomcat,Springboot 等可直接使用
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out fullchain_and_key.p12 -name name