1. 前期准备工作
双向证书认证的双方称为client和server,首先为client和server生成证书。由于仅仅是自己学习使用,因此可以在本地自建一个CA,然后用CA的证书分别签发client和server的证书。CA的创建和签发使用OpenSSL。
在windows环境上安装OpenSSL,然后依据OpenSSL目录下的openssl.cnf中[ CA_default ]的配置创建相应的文件夹和文件
demoCA/ —- CA的根目录
|– newcerts/—- CA签发出去的证书
|– private/ —- CA自己的私钥,默认名称是cakey.pem
|– serial —- 存放证书序列号的文件
|– index.txt —- 签发过的证书的记录,文本文件
serial这个文件中可以初始写入一行记录,包含两个字符01,表示下一个签发的证书采用的序列号是01
接下来生成CA自己的公私钥(public/private key),生成证书签名请求(CSR, Certificate Signing Request)文件并对该请求进行自签名
在openssl的根目录下运行
openssl genrsa -out ./demoCA/private/cakey.pem 2048
genrsa —- 同时生成public key和private key
很多人将genrsa解释为只生成private key,这是不对的。可以用下面的命令从文件中解出公钥
openssl rsa -in cakey.pem -pubout > capublickey.pub
注意最后的数字2048表示生成的RSA公私钥的长度
JDK7中对证书检查要求公钥的长度最少为1024位,否则会抛出异常
java.security.cert.CertPathValidatorException: Algorithm constraints check failed
该长度限制是可以配置的,配置文件路径是JAVA_HOME/jre/lib/security/java.security
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
然后用上面生成的公私钥文件创建一个证书签名请求文件
openssl req -new -key ./demoCA/private/cakey.pem -out careq.pem
req —- 创建CSR或者证书-key —- openssl从这个文件中读取private key
careq