本文根据这篇博文(http://lovesea.blog.51cto.com/382446/95572)和《OpenSSL与网络信息安全:基础、结构和指令》一书整理。关于OpenSSL在Windows下的编译安装,参见上一篇文章

准备工作:

1、添加配置文件(openssl.cnf)的环境变量:OPENSSL_CONF。配置文件可从OpenSSL解压后根目录下的apps目录下拷贝,再自行修改配置。

2、创建ssl目录,在ssl目录下创建newcerts目录、index.txt空文件、serial文件,在serial文件中写入序列号01。

3、打开配置文件(openssl.cnf),找到[CA_default]字段,将dir = ./demoCA 改为dir = .  。

4、以管理员身份运行命令提示符,进入新建的ssl目录;输入openssl,进入openssl指令环境,不然后面每个命令前面都要加上openssl。

正式开工:

1、生成自签名根证书。

   (1)、生成根证书私钥(ca.key)。

  • 生成一个2048位的RSA私钥,并输出到ca.key文件中,对输出密钥不进行加密,指令为:genrsa -out ca.key 2048

  • 可以以加密方式生成私钥,加密算法可以用des、des3、idea、aes128、ads192和aes256。这里选用了aes256:genrsa -aes256 -out ca.key 2048 。运行时会提示输入密码。

  • 可以给未加密的私钥添加口令:rsa -aes256 -in ca.key -out ca.key

  • 也可以去除加密私钥的口令:rsa -in ca.key -out ca.key

   (2)、生成有效期为90天的根证书(ca.crt)。x509选项让指令生成一个自签名根证书二不是输出一个证书请求。

req -new -x509 -days 90 -key ca.key -out ca.crt

2、生成服务器端私钥和证书。

   (1)、生成服务器私钥(server.key):

genrsa -aes256 -out server.key 2048

   (2)、生成服务器证书请求文件(server.csr):

req -new -key server.key -out server.csr

   (3)、用CA证书给服务器签证,限定证书(server.crt)有效期为2012年7月29日到2013年1月1日。date的格式为YYMMDDHHMMSSZ,即“年月日时分秒Z” 。

ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -startdate 120729000000Z -enddate 130101000000Z

3、生成客户端私钥和证书。

   (1)、生成客户端私钥(client.key):

genrsa -aes256 -out client.key 2048

   (2)、生成客户端证书请求文件(client.csr):

req -new -key client.key -out client.csr

   (3)、用CA证书给客户端签证,限定证书(client.crt)有效期为2012年8月8日到2013年8月8日。

ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -startdate 120808000000Z -enddate 130808000000Z

   所有证书生成完毕。

应用:

1、单向验证,客户验证服务器端,例如https服务器。

服务器端需两个文件:server.crt,server.key

客户端如浏览器需要一个文件:ca.crt

2、如果需要自己实现双向认证。

服务器端需要的文件为:ca.crt,server.crt,server.key

客户端需要的文件为:  ca.crt,client.crt,client.key


**** 2017-05-26 补充 ***

1、Android HTTPS SSL双向验证

  其中客户端的 client.truststore 文件对应上面的 ca.crt ,client.p12文件对应上面的 client.crt,client.key  。

2、Qt HTTPS SSL 双向验证

  p12文件是证书和私钥的合体,Qt貌似只能证书和私钥分开使用。

  如果需要用 Qt 对接上面 Android 的服务端,

  可以用 openssl 把 client.p12 中提取出用户证书和私钥;

  用 java 的 keytool 把 jks 文件(client.truststore)转换成 p12文件,再用 openssl 提取根证书。

3、Qt的 QSslCertificate::importPkcs12 函数只能加载包含私钥的 p12 文件,加载不包含私钥的 p12 文件会崩溃。


相关阅读:

1、Win32下VC编译OpenSSl

2、那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

3、Open××× 详细配置说明:Open×××连接两个局域网(使用华硕RT-AC87U)

5、Open××× 教程


*** walker ***