公钥,证书文件信息格式,通常后缀名是der,cer,crt,内容是二进制数据。
私钥,证书,公钥信息格式,通常后缀名是pem,cer,crt,内容是二进制数据base64编码
以上截图是利用openssl 工具生成的传统pem格式的私钥文件内容。(注意开头结尾有RSA字母,区别pkcs8格式私钥),上图中
openssl 命令可以将PEM格式转换为DER格式
例如 pem 密钥转换为 der 格式密钥
openssl rsa -in key.pem –outform der –outkey.der
pem格式证书到der格式证书转换
openssl x509 -in ca-cert.pem -outca-cert.der -outform der
pem 和 der 格式的区别是 pem 是 der 格式内容的base64编码加上首尾两行(BEGIN……和END……)
PKCS标准目前已经公布了15种
常用的几种如下:
利用openssl 生成传统格式(PEM)私钥
openss genrsa –out privateKey.pem 2048
转换成pkcs8 格式 (图1.2 的传统格式私钥转换成pkcs8格式)
openssl pkcs8 –topk8 –in privateKey.pem –out privateKeyPkcs8.pem –nocrypt
注意 区别传统的PEM和PKCS8 格式的私钥方法是:
1 传统的PEM格式的头部是BEGIN RSA PRIVATE KEY
2 PKCS#8 格式私钥文件头部是BEGIN PRIVATE KEY
注意 PHP 语言对于两种格式私钥可以都可以直接使用。
注意 对privateKeyPkcs8.pem 再进行一次pkcs8格式转换,其内容不变(diff–u 比较)。
注意 只有私钥才存在这两种格式(pkcs8 和传统格式)
PKCS#8 是RSA公司制定的标准,相对传统PEM私钥格式更加通用些。
另外PKCS#8格式的私钥可以再加密一层(使用对称加密算法),更加安全些。
该文件包括签名算法,公钥信息,申请者信息,使用openssl req 命令可以生成证书请求文件,通常后缀名为csr
例如:openssl req –new –key su-key.pem –outsu-req.csr –days 3650
使用一个私钥su-key.pem 生成一个pkcs#10格式的证书请求文件
该文件包括私钥 公钥和证书, 通常后缀是pfx,p12,导入浏览器个人证书格式(使用opensslpkcs12 可以导出客户端个人证书)
例如:openssl pkcs12 –export –clcerts –in qiyi-cert.pem–inkey qiyi-key.pem –out qiyi.p12
-clcerts 表示只导出客户端证书
qiyi-cert.pem 客户端签名好的PEM格式证书(包含公钥和其他域名等信息)
qiyi-key.pem 客户端PEM格式私钥文件
qiyi.p12 是导出的包含证书,私钥等信息的个人证书 (后缀名也可以为pfx)
其他PKCS格式标准本人未深入了解,这里介绍的三种是配置https双向认证(pkcs10,pkcs#12) 以及非对称加密解密(pkcs8) 时使用到的。
本次app 基金超市中,服务器端语言是PHP,服务器是nginx。服务器端和Android以及Ios 使用的都是PKCS#8格式的私钥,公钥是PEM格式,其中服务器端使用的私钥跟换为其他格式例如传统格式PEM,也能够解密,android则不能使用传统格式私钥,必须为PKCS#8,ios也必须是用PKCS#8格式。
双向认证主要工作是用来分发对称加密密钥信息。
具体分发过程如下:
1 浏览器发送连接请求到https服务器
2 服务器将自己的证书信息发送给客户端
3 客户端验证服务器证书的合法性
验证服务器证书是否由受信任的根证书颁发机构(CA)所颁发(主要是验证签名,CA证书公钥解密签名结果与利用签名算法和服务器证书信息生成的签名是否一致)
验证证书的周期是否过期
验证证书的签发机构是否在吊销机构列表中(此过程未详细研究)
验证证书中域名信息是否和访问的域名一致
如果上面四个条件有一个不满足,则提示用户该服务器不可信,由用户选择是否继续访问
4 客户端发送个人证书和一个产生对称加密密钥的随机数(使用从服务器证书中的公钥加密)到服务器,服务器验证客户合法性(是否由某一个配置的信任机构签发 ,是否过期),如果合法,则从证书中获取客户端公钥
5 客户端通知服务器 将使用步骤4中发送的随机数形成对称密钥加密本次连接接下来的 数据以及客户端到服务器认证结束
6 服务器通知客户端 将使用步骤4 中接受的随机数形成对称密钥加密本次连接接下来的通讯数据以及服务器到客户端的认证结束
nginx 开启https 服务需要安装openssl库,这方面内容这里就不再说明。
以下示例 可以自行尝试(在nginx 已经多次尝试没有问题,在apache也尝试一次OK)
l 生成CA私钥(PEM格式)
openssl genrsa -out ca-key.pem 2048
l 生成证书请求文件(pkcs#10格式)
openssl req –new –key ca-key.pem –out ca-req.csr –days 3650
(-key 指定私钥文件–new 指定生成一个新证书–days 指定有效期)
l 签名CA证书请求
openssl x509 –req –in ca-req.csr –out ca-cert.pem –signkey ca-key.pem –days3650
证书通常是包括公钥和一些其他信息的文件。
l 生成服务器端私钥文件
openssl genrsa –out serverKey.pem 2048
l 生成服务器端证书请求文件
openssl req –new –key serverKey.pem –out server.csr –days 3650 (会提示输入输入一些个人信息,其中注意的就是域名输入的时候,一定要输入正确的域名,否则导致客户端验证服务器证书合法性始终提示不合法)
l 生成服务器端证书
openssl x509 –req –in server.csr –out server.pem –days 3650 –CAca-cert.pem –CAkey –ca-key.pem –CAcreateserial
(-CAkey 指定CA机构的私钥 –CA 指定CA机构的证书 –CAcreateserial创建CA序列号)
浏览器客户端证书比服务器端证书多个重要信息为私钥。
生成浏览器客户端证书(包括客户端私钥 公钥证书pfx/pkcs#12格式)
l 生成客户端私钥(PEM)
openssl genrsa –out clientKey.pem -2048
l 生成客户端证书请求(PKCS#10)
openssl req –new –key clientKey.pem –out client-req.csr days -3650 (会提示用户输入个人信息)
l 生成客户端证书(PEM)
openssl x509 –req –in client-req.csr –out client-cert.pem –days 3650 –CAca-cert.pem –CAkey ca-key.pem –CAcreateserial
l 转换客户端证书到PKCS#12格式(浏览器需要的格式,包括私钥,公钥证书信息)
openssl pkcs12 –export –in client-cert.pem –in clientKey.pem –out client.pfx
客户端浏览器导入证书示例:
IE->工具->Internet选项->内容->证书->个人
导入pfx格式个人证书client.pfx
IE->工具->Internet选项->内容->证书->受信任的根证书
导入ca-cert.pem
nginx 服务器端配置(http server模块)
ssl_certificate server.pem //指定服务器证书 server.pem
ssl_certificate_key serverKey.pem //服务器私钥serverKey.pem
ssl_client_certificate ca-cert.pem //CA机构证书 验证客户端证书的合法性
ssl_verify_client on //开启验证客户方证书功能
实际验证的过程,客户端发送请求到https服务器指定端口,服务器将证书server.pem 发送到客户端浏览器,浏览器利用导入到受信任的根证书中
实验分组:
1: 配置nginx服务器双向认证,浏览器未导入受信任的根证书和个人证书,首先提示服务器不可信任,是否继续访问,用户点击继续,后提示未发送要求的证书
2 服务器端删除 ssl_verify_client on, 1条件下则又可以继续访问
3 恢复ssl_verify_client on,按照图2.1 导入客户端浏览器两个证书(CA和个人)则可以正常访问。
opensslgenrsa生成私钥
openssl genrsa –outprivateKey.pem 2048
openssl rsa生成公钥
openssl rsa –in privateKey.pem –out –pubout –out publicKey.pem
openssl rsa –in privateKey.pem –out –pubout –outpublicKey.der –outform der (生成der格式公钥,注意只有公钥和证书有der格式)
非对称加密算法与对称加密算法主要区别是非对称加密解密的密钥不同(RSA),对称加密解密其密钥是相同的,主要有DES,三重DES
转换私钥到PKCS#8格式
openssl pkcs8 –topk8 –in privateKey.pem –out privateKeyPkcs8.pem –nocrypt
(转换私钥为pkcs8格式,-nocrypt 表示不加密,否则会将私钥信息进行一次对称算法的加密)
openssl req 命令(http://blog.csdn.net/fym0121/article/details/7992340)
-new 用于生成新的证书请求 如果没有指定-key 会先生成私钥
-key 指定私钥文件
-out 输出文件(默认PEM格式)
openssl x509 命令(http://blog.csdn.net/allwtg/article/details/4982507)
签名证书请求文件,形成证书文件以及转换证书格式,显示证书内容
-req 指定输入文件是证书请求文件
-in 指定输入文件
-out 输出证书文件
-CAkey CA机构私钥文件
-CA CA证书文件
-days 有效期
-signkey 指定生成自签名CA证书时 使用的私钥文件(注意去CAkey区别)
常见证书格式转换
http://blog.csdn.net/rztyfx/article/details/6919220
openssl 命令学习网址
http://blog.csdn.net/as3luyuan123/article/details/16105435
PKCS8 格式和PEM格式区别
http://diabloneo.diandian.com/post/2013-04-17/40050808307
nginx https 双向认证配置
http://isouth.org/archives/347.html
http://www.cnblogs.com/dyllove98/p/3157370.html
openssl rsa 命令
http://blog.csdn.net/as3luyuan123/article/details/16811945
openssl 命令分类
http://wenku.baidu.com/link?url=KQR2uQzcmgZWRe-rqaSD0oCk7-rQfX-ndWI34BfR_2bcW-3NLavGBxhsxrX-ogMxE5lXVCtUndh9gn-0UyBUT37toGPv8L6qT1hfIMd-DYi
ssl 双向认证原理
http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html