双向证书认证的双方称为client和server,首先为client和server生成证书。由于仅仅是自己学习使用,因此可以在本地自建一个CA,然后用CA的证书分别签发client和server的证书。CA的创建和签发使用OpenSSL。
在windows环境上安装OpenSSL,然后依据OpenSSL目录下的opensslcnf中[ CA_default ]的配置创建相应的文件夹和文件
serial这个文件中可以初始写入一行记录,包含两个字符01,表示下一个签发的证书采用的序列号是01
接下来生成CA自己的公私钥(public/private key),生成证书签名请求(CSR, Certificate Signing Request)文件并对该请求进行自签名
在openssl的根目录下运行
genrsa —- 同时生成public key和private key
很多人将genrsa解释为只生成private key,这是不对的。可以用下面的命令从文件中解出公钥
注意最后的数字2048表示生成的RSA公私钥的长度
JDK7中对证书检查要求公钥的长度最少为1024位,否则会抛出异常
javasecuritycertCertPathValidatorException: Algorithm constraints check failed
该长度限制是可以配置的,配置文件路径是JAVA_HOME/jre/lib/security/javasecurity
jdkcertpathdisabledAlgorithms=MD2, RSA keySize < 1024
然后用上面生成的公私钥文件创建一个证书签名请求文件
req —- 创建CSR或者证书
-key —- openssl从这个文件中读取private key
careqpem的内容格式是
最后将该请求文件给CA机构做签名,但我们现在是想在本地建CA,因此自己对该文件进行自签名即可。
其实,上面生成CSR然后做自签名的两个步骤可合并到一步完成
至此,我们已经建立了自己的CA,接下去来分别签发client和server的证书。
以创建client的证书为例。由于jdk自带的keytool工具可以方便的创建key store和公私钥,因此公私钥和csr的创建直接使用keytool
key store和trust store分别对应于ssl握手证书认证中自己的证书和自己所信任的证书列表,二者的文件格式相同,不同之处是key store里面包含ssl握手一方的公私钥和证书,trust store里面包含ssl握手一方所信任的证书,一般没有这些证书所对应的私钥
client证书中我们想添加证书的一项扩展,比如client id,用来区分client的身份,因此需要额外的一份扩展文件clientcnf,内容如下
在导入之前,需要先将CA的证书导入keystore文件
然后导入client自己的证书。注意alias是client,与生产keystore和key pair的必须匹配
keystore文件内容的查看可以使用
或者使用可视化工具KeyStore Explorer查看
由于server的证书也是本地CA签发的,因此client只要信任CA的证书那么自然会信任CA签发出的证书,所以我们只需将CA的证书导入trust store即可
由于clienttruststorekeystore文件尚不存在,此命令首先创建该文件并将CA的证书导入该trust store
由于netty 5现在只有alpha版本,因此保险起见使用4024final版本的netty。
netty的SSLContext提供了newClientContext来为client创建ssl context,但查看其源码未发现能支持双向认证,即client端的ssl context只接收一个trust store,而不能指定自己的证书以供server端校验。仿照netty example下的securechat的ssl实现但做了修改
首先创建一个能提供client和server的ssl context的工具类,分别加载server和client的key store和trust store里面的证书
ionettyexamplesecurechatSecureChatClientInitializer类的构造器接收一个ionettyhandlersslSslContext类型的对象,这个SslContext的对象最终被用来创建SslHandler,而上面factory产生的是javaxnetsslSSLContext的对象,因此可以做改动如下
最后添加jvm参数
来查看ssl握手过程控制台的log
具体实现请参考附件源码。
>
以上就是关于Netty中使用SSL 双向认证(包括证书生成)全部的内容,包括:Netty中使用SSL 双向认证(包括证书生成)、如何在struts+spring+hibernate项目中实现对线程的监控、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)