最近,在跟外部的一个服务进行接口对接,需要对调用双方的身份进行验证。采用了RSA非对称签名对方式来进行验证。主要记录一下Java读取OpenSSL生成的RSA密钥对的操作过程。
1.使用openssl生成private key
1 | openssl genrsa -out private.pem 2048 |
生成一个新的长度为2048位RSA private key。密钥存储在private.pem文件中,密钥文件是PEM格式。PEM格式实际上就是对DER结构的Base64编码,查看该文件,可以看到文件以”BEGIN RSA PRIVATE KEY”为头,”END RSA PRIVATE KEY”为结尾。
1 | head -2 private.pem; tail -1 private.pem |
2.生成public key
1 | openssl rsa -in private.pem -out public.pem -pubout |
生成的公钥也是PEM格式。
1 | head -2 public.pem; tail -1 public.pem |
3. 解析生成的Key
由于Java不能直接加载openssl生成的PEM格式,这里需要做一下转换。这里插一句关于PEM的说明,PEM实际上是DER编码然后进行Base64编码,再加上对Key进行说明的头和尾。
1 | -inform DER|NET|PEM |
在PKCS#1(RFC 3447)标准中定义了RSAPrivateKey和SubjectPublickeyInfo的结构。
1 | RSAPrivateKey ::= SEQUENCE { |
由于Java可以解析DER格式,所以转换的思路是去掉PEM文件中的头和尾,然后再Base64解码。
3.1 解析Public Key
代码片段
1 | //此处省略部分代码 |
代码中使用X509EncodedKeySpec
来加载public key,X509EncodedKeySpec
是Java对SubjectPublickeyInfo的实现. Note: 代码中用到了commons-codec工具包来进行Base64解码
3.2 解析Private Key
暂时还不能采用同样的方法直接去解析openssl生成的private key文件。因为Java中能直接识别的private key编码格式是PKCS#8.这里就需先对刚才生成的private key文件进行一次转换。
1 | openssl pkcs8 -in private.pem -topk8 -nocrypt -out privatekey_key.pem |
转换后文件内容如下:
1 | head -2 private_key.pem; tail -1 private_key.pem |
注意,在这里没有对进行加密
。然后再进行解析,代码片段如下:
1 |
|