一. CA自签
1.建立 CA 目录结构
mkdir -p ./demoCA/{private,newcerts}
touch ./demoCA/index.txt
echo 01 > ./demoCA/serial
# 生成 CA 的 RSA 密钥对
openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048
# 生成 CA 证书请求
openssl req -new -x509 -days 3650 -key ./demoCA/private/cakey.pem -out careq.pem
#复制一份证书
cp cacert.pem ca.crt
二.生成和签发服务器、客户端证书
#修改openssl配置文件
/etc/pki/tls/openssl.cnf
设置好
dir = /root/ssl/demoCA (生成CA的路径)
# 生成服务器的 RSA 密钥对
openssl genrsa -des3 -out server.key
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令。
去除key文件口令的命令:
openssl rsa -in server.key -out server.key
# 生成服务器证书请求
openssl req -new -days 3650 -key server.key -out server.csr
# 使用 CA 签发服务器证书
openssl ca -in server.csr -out server.crt -days 3650
也可以直接指定好根证书的和其私钥的路径
openssl ca -in server.csr -out server.crt -cert ./demoCA/cacert.pem -keyfile ./demoCA/private/cakey.pem
*生成用户的 RSA 密钥对
openssl genrsa -des3 -out user.key
*生成用户证书请求
openssl req -new -days 3650 -key user.key -out user.csr
*使用 CA 签发用户证书
openssl ca -in user.csr -out user.crt
三.导出用户证书client.pfx供浏览器使用
openssl pkcs12 -export -clcerts -in user.cert -inkey user.key -out client.pfx
四.apache的ssl配置
ServerName free51.alipay.net
LogLevel info
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /opt/install/httpd/conf/sslcrt/server.crt
#SSLCertificateFile 指定服务器使用的证书。该指令用于指定服务器持有的X.509证书(PEM编码),其中还可以包含对应的RSA或DSA私钥。如果其中包含的私钥已经使用 密语加密,那么在 Apache启动的时候将会提示输入密语。如果服务器同时使用了RSA和DSA两种证书,那么该指令可以使用两次来分别指定两种证书的位置。
SSLCertificateKeyFile /opt/install/httpd/conf/sslcrt/server.key
#SSLCertificateKeyFile 指定了服务器私钥文件。如果SSLCertificateFile指定的服务器证书文件中不包含相应的私钥,那么就必须使用该指令,否则就不需要使用。我 们反对在服务器证书中包含私钥,正确的做法应该是将证书和私钥分开在不同的文件中。如果私钥文件已经使用密语加密,那么在Apache启动的时候将会提示 输入密语。如果服务器同时使用了RSA和DSA两种证书,那么该指令可以使用两次来分别指定两种私钥的位置。
SSLCertificateChainFile /opt/install/httpd/conf/sslcrt/ca.crt #如果有很久级证书就好好配这个。
#SSLCertificateChainFile 指定了一个多合一的CA证书:由直接签发服务器证书的CA证书开始,按证书链顺序回溯,一直到根CA的证书结束,这一系列的CA证书(PEM格式)就构成 了服务器的证书链。这个指令也可以由SSLCACertificatePath指令代替,或者两个一起使用,用于明确的创建服务器的证书链。这个证书链将 被与服务器证书一起发送给客户端。这有利于避免在执行客户端认证时多个CA证书之间出现混淆或冲突。因为虽然将服务器证书链上的某个CA证书放到 SSLCACertificatePath目录中对于证书链结构没什么影响,但是由这个CA签发的客户端证书也会在执行客户端认证的时候同时被认可,这通 常不是你期望的结果。
SSLCACertificateFile /opt/install/httpd/conf/sslcrt/ca.crt
#SSLCACertificateFile 该指令用于客户端认证。这个指令指定了一个多合一的CA证书,只有持有这些CA所签发证书的客户端才允许访问。这个所谓"多合一"证书文件其实就是将多个 PEM格式的证书按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLCACertificatePath指令代替,或者两个一起使用。
SSLVerifyClient require
#要求进行客户端认证。
SSLVerifyDepth 1
SSLOptions +StdEnvVars
五、ssl链接测试
openssl s_client -connect 10.12.22:443 -showcerts -state -CAfile CA.crt
可以使用这个的命令来查看ssl通信的过程
来源:oschina
链接:https://my.oschina.net/u/853533/blog/215590