SSL证书属于私钥/公钥的非对称加密方式
常用字段
其他常用字段:
SSL证书管理服务支持的“域名类型”有“单域名”、“多域名”和“泛域名”3种类型
以上提到的 DV,OV和EV 是指CA机构颁发的证书的认证类型,常见有3种类型:
如果是企业/网站对外提供服务,一般按需购买证书服务商颁发的付费证书
证书按照用途定义分类,一般分为 CA根证书,服务端证书, 客户端证书:
openssl genrsa -out root.key 2048 -passout pass:"ca_key_密码"
openssl req -new -key root.key \
-out root.csr \
-passin pass: "ca_key_密码" \
-subj "/C=CN/ST=Bejing/L=BJ/O=RD/OU=RDTEAM/CN=hadoop.com"
openssl x509 -req -sha256 \
-extensions v3_ca \
-days 3650 \
-in ca.csr \
-signkey ca.key \
-passin pass: "ca_key_密码" \
-out ca.crt
以上也可以简写为
openssl req -newkey rsa:2048 \
-keyout ca.key \
-out ca.crt \
-days 3650 \
-x509 \
-passout pass:"ca_key_密码" \
-subj '/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=hadoop.com'
创建自签名根根证书过程:生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)
最终生成文件列表
#!/bin/bash
for cert_name in client server
do
openssl genrsa -out ${cert_name}.key 2048 \
-passout pass:111111
openssl req -new -key ${cert_name}.key \
-out ${cert_name}.csr \
-passin pass:111111 \
-subj "/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=${cert_name}.hadoop.com"
if [ -f ca.srl ];then
openssl x509 -req -sha256 \
-extensions v3_req \
-days 3650 \
-in ${cert_name}.csr \
-CAkey ca.key \
-CA ca.crt \
-CAserial ca.srl \
-passin pass:"ca_key_密码" \
-out ${cert_name}.crt
else
openssl x509 -req -sha256 \
-extensions v3_req \
-days 3650 \
-in ${cert_name}.csr \
-CAkey ca.key \
-CA ca.crt \
-CAcreateserial \
-passin pass:"ca_key_密码" \
-out ${cert_name}.crt
fi
done
创建自签名根根证书过程:生成server私钥(.key)-->生成server证书请求(.csr)-->使用CA根证书为server证书签名,生成server证书文件(.crt)
最终生成文件
常见的证书格式有,pem格式,PFX格式,JKS格式
x509 证书常见的文件后缀为.pem、.crt、.cer、.key
truststore和keystore的性质是一样的,都是存放key的一个仓库,区别在于,
用途 | PEM格式 | PKCS12格式 | JKS格式 | 备注说明 |
---|---|---|---|---|
根私钥 | ca.key | 保护方式:密钥口令(keypass) 使用范围:仅限于证书管理端 | ||
根证书 | ca.cert | ca.p12 | ca.jks (truststore) | 使用范围:公开 |
服务端 | server.key server.cert | server.p12 | server.jks (keystore) | 保护方式:密钥口令(keypass) 密钥库口令(storepass) 使用范围:服务端 |
客户端 | client.key client.crt | client.p12 | client.jks (keystore) | 保护方式:密钥口令(keypass),密钥库口令(storepass) 使用范围:客户端 |
#!/bin/bash
for item in ca:ca_key_pw server:server_key_pw client:client_key_pw
do
cert_name=`echo $item | awk -F: '{print $1}'`
key_pass=`echo $item | awk -F: '{print $2}'`
openssl pkcs12 -export \
-name ${cert_name} \
-inkey ${cert_name}.key \
-passin pass:${key_pass} \
-passout pass:${key_pass} \
-in ${cert_name}.crt \
-out ${cert_name}.p12
done
最终生成文件
由于PKCS12格式是包含私钥和证书,使用的时候存在如何问题:如果作为客户端,需要CA证书做验证,导入ca.p12证书的同时也会将ca.key导入;对于CA的私钥的使用范围要严格限制的,做客户端证书格式转换的时候,可以通过 -chain 参数将 ca.crt 包含进去,以下是推荐用法:
for item in client:client_key_pw
do
cert_name=`echo $item | awk -F: '{print $1}'`
key_pass=`echo $item | awk -F: '{print $2}'`
openssl pkcs12 -export \
-name ${cert_name} \
-chain -CAfile ca.crt \
-inkey ${cert_name}.key \
-passin pass:${key_pass} \
-passout pass:${key_pass} \
-in ${cert_name}.crt \
-out ${cert_name}.p12
done
以MacOS 系统,浏览器作为客户端访问,为例:
系统设置-> 钥匙串访问 -> 文件 -> 导入项目 导入 client.p12 证书,并设置为ca证书为始终信任,如果是双向认证模式,浏览器访问对应 https 服务,选择client证书即可访问
keytool -import -trustcacerts \
-alias ca \
-file ca.crt \
-storepass ca_store_pass \
-keystore ca.jks \
-noprompt
最终生成文件 ca.jks
#!/bin/bash
export store_pass=store_pw_xxxx
for item in server:key_pass_xxx:new_pass_xxx client:key_pass_xxx:new_pass_xxx
do
cert_name=`echo $item | awk -F: '{print $1}'`
key_pass=`echo $item | awk -F: '{print $2}'`
new_pass=`echo $item | awk -F: '{print $3}'`
keytool -importkeystore \
-srckeystore ${cert_name}.p12 \
-srcstoretype PKCS12 \
-srcstorepass ${key_pass} \
-alias ${cert_name} \
-deststorepass ${store_pass} \
-destkeypass ${new_pass} \
-destkeystore ${cert_name}.jks \
-noprompt
done
最终生成文件
keytool -list -v -keystore xxx.jks 输入 storepass
导出私钥:
openssl pkcs12 -in client.p12 -passin pass:$passwd -nokeys -out client.pem
导出证书:
openssl pkcs12 -in client.p12 -passin pass:$passwd -nocerts -out client.crt
修改nginx配置文件,server字段
server {
listen 443 ssl;
server_name server.example.com;
root /usr/share/nginx/html;
ssl_certificate server.crt;
ssl_certificate_key server.key;
}
重启nginx服务,执行命令验证https服务:
echo "127.0.0.1 server.example.com" >> /etc/hosts
curl https://server.hadoop.com:443 --cacert /root/KEY/ca.crt
修改nginx配置文件,server字段
server {
listen 443 ssl;
server_name server.example.com;
ssl_certificate /data/sslKey/server.crt; #server证书公钥
ssl_certificate_key /data/sslKey/server.key; #server私钥
ssl_client_certificate /data/sslKey/ca.crt; #根级证书公钥,用于验证各个二级client
ssl_verify_client on; #开启客户端证书验证
}
}
重启nginx服务,执行命令验证https服务 :
echo "127.0.0.1 server.example.com" >> /etc/hosts
curl https://server.example.com:443 \
--cacert /root/KEY/ca.crt \
--cert /root/KEY/client.crt \
--key /root/KEY/client.key
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate
certificateKeystoreFile="/usr/local/tomcat/cert/server.jks"
certificateKeystorePassword="store_pass_xxx"
certificateKeystoreType="JKS"
type="RSA" />
</SSLHostConfig>
</Connector>
docker run -d \
-v /data/server.jks:/usr/local/tomcat/cert/server.jks \
-v /data/server.xml:/usr/local/tomcat/conf/server.xml \
--name=tomcat \
--net=host \
uhub.service.ucloud.cn/ucloud_pts/tomcat:9.0
docker exec -t -i tomcat sh -c "rm -rvf webapps; mv webapps.dist/ webapps"
docker restart tomcat
验证java应用https服务
echo "127.0.0.1 server.example.com" >> /etc/hosts
curl https://server.example.com:443 --cacert /root/KEY/ca.crt
准备好证书:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
修改 server.xml SSL配置部分,参考如下:
<Connector port="9443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" scheme="https" SSLEnabled="true" secure="true">
<SSLHostConfig
protocols="all"
certificateVerification="required"
truststoreFile="/usr/local/tomcat/cert/ca.jks"
truststorePassword="store_pass_xxx" >
<Certificate
certificateKeystoreType="JKS"
certificateKeystoreFile="/usr/local/tomcat/cert/server.jks"
certificateKeystorePassword="store_pass_xxx"
type="RSA" />
</SSLHostConfig>
</Connector>
Tomcat官方文档: https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#HTTP/1.1_and_HTTP/1.0_Support
docker run -d \
-v /data/ca.jks:/usr/local/tomcat/cert/ca.jks \
-v /data/server.jks:/usr/local/tomcat/cert/server.jks \
-v /data/server.xml:/usr/local/tomcat/conf/server.xml \
--name=tomcat \
--net=host \
uhub.service.ucloud.cn/ucloud_pts/tomcat:9.0
docker exec -t -i tomcat sh -c "rm -rvf webapps; mv webapps.dist/ webapps"
docker restart tomcat
验证java应用https服务:
echo "127.0.0.1 server.example.com" >> /etc/hosts
curl https://server.example.com:443 \
--cacert /root/KEY/ca.crt \
--cert /root/KEY/client.crt \
--key /root/KEY/client.key
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。