证书签名的配置
# server.openssl.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = CN
ST = Zhejiang
L = Hangzhou
O = zoumo
OU = zoumo
CN = localhost
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = serviceName
DNS.2 = serviceName.namespace
DNS.3 = serviceName.namespace.svc
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
自签 key 和证书
# 快速自签无密码的证书和 key
# -nodes don't encrypt the output key
# -days 36500 = 100 years
openssl req -nodes -x509 -newkey rsa:2048 -days 36500 -keyout server.key -out server.crt -subj "/C=CN/ST=Zhejiang/L=HangZhou/O=zoumo/CN=Zoumo Root CA"
自建 CA 再签证书
export SAN_IP="10.158.67.220"
# 快速生成 CA 私钥和证书
openssl req -new -nodes -x509 -newkey rsa:2048 -days 36500 -extensions v3_ca -keyout ca.key -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=zoumo/CN=Zoumo Root CA"
# 快速生成证书请求
openssl req -new -nodes -newkey rsa:2048 -days 36500 -keyout server.key -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=zoumo/CN=localhost"
# 用 CA 签名
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -days 36500 -extensions v3_usr -extensions SAN -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\\nsubjectAltName=IP:${SAN_IP},DNS:localhost"))
一般证书分为两类 自签名证书 和 CA证书,自签名顾名思义就是自己签名的证书,一般是不能用来进行身份认证的,如果 server 端要使用自签名的证书,则 client 需要无条件信任任何证书或者将自签名证书的公钥和私钥加入受信任的列表,这样一来会增加 server 私钥泄露的风险。
TLS 基于 CA 的身份认证的基本原理是:需要验证方信任 CA 提供方的证书(CACert), 比如证书在操作系统的受信任证书列表中,或者用户通过“安装根证书”等方式将 CA的公钥和私钥加入受信任列表;然后 CA 对被验证方的原始证书进行签名(私钥加密),生成最终的证书;验证方得到最终的证书后,利用 CAcert 中包含的公钥进行解密,得到被验证方的原始证书。
根据RSA的加密原理,如果用CA的公钥解密成功,说明该证书的确是用CA的私钥加密的,可以认为被验证方是可信的。
openssl genrsa -out ssl.key 2048
还可以对私钥进行加密
openssl rsa -in ssl.key -des3 -out encrypted.key
openssl rsa -in ssl.key -pubout -out ssl.pub
利用私钥就可以生成证书了。OpenSSL 使用 x509 命令生成证书。这里需要区分两个概念:证书(certificate) 和证书请求(certificate sign request)