Netty中使用SSL 双向认证(包括证书生成)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty中使用SSL 双向认证(包括证书生成)相关的知识,希望对你有一定的参考价值。

参考技术A 双向证书认证的双方称为client和server,首先为client和server生成证书。由于仅仅是自己学习使用,因此可以在本地自建一个CA,然后用CA的证书分别签发client和server的证书。CA的创建和签发使用OpenSSL。
在windows环境上安装OpenSSL,然后依据OpenSSL目录下的openssl.cnf中[ 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位,否则会抛出异常

java.security.cert.CertPathValidatorException: Algorithm constraints check failed
该长度限制是可以配置的,配置文件路径是JAVA_HOME/jre/lib/security/java.security
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

然后用上面生成的公私钥文件创建一个证书签名请求文件

req —- 创建CSR或者证书
-key —- openssl从这个文件中读取private key
careq.pem的内容格式是

最后将该请求文件给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的身份,因此需要额外的一份扩展文件client.cnf,内容如下

在导入之前,需要先将CA的证书导入keystore文件

然后导入client自己的证书。注意alias是client,与生产keystore和key pair的必须匹配

keystore文件内容的查看可以使用

或者使用可视化工具KeyStore Explorer查看

由于server的证书也是本地CA签发的,因此client只要信任CA的证书那么自然会信任CA签发出的证书,所以我们只需将CA的证书导入trust store即可

由于clienttruststore.keystore文件尚不存在,此命令首先创建该文件并将CA的证书导入该trust store

由于netty 5现在只有alpha版本,因此保险起见使用4.0.24.final版本的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里面的证书

io.netty.example.securechat.SecureChatClientInitializer类的构造器接收一个io.netty.handler.ssl.SslContext类型的对象,这个SslContext的对象最终被用来创建SslHandler,而上面factory产生的是javax.net.ssl.SSLContext的对象,因此可以做改动如下

最后添加jvm参数

来查看ssl握手过程控制台的log

具体实现请参考附件源码。

http://download.csdn.net/detail/virgilli/8373319

附录:
openssl的配置
对证书签名时,遇到openssl异常failed to update database TXT_DB error

可以有三种方法解决这个问题

方法一:

修改demoCA下 index.txt.attr

unique_subject = yes
改为
unique_subject = no

方法二:
删除demoCA下的index.txt,并再touch下
方法三:

将 common name设置成不同的

有可能是因为签名的csr文件的subject中的一项或几项在该CA之前签发过的证书中已经出现过或者是csr中提供的国家/省份等等的名称与CA自己的不相同,这些限制都可以在openssl.cnf文件中修改
unique_subject=no
[ policy_match ]
countryName = match

organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

ssl证书双向认证的好处,认证流程是怎样的

ssl是一种数字证书,这是安全证书的一种,很多网站当中都会配置该证书,因为这种证书配置到网站服务器当中去之后,就可以有很多的作用。另外,这种证书一般都是双向认证的,而且认证之后有一定的好处。那么,ssl双向认证的好处一般有哪些呢?

ssl双向认证的好处:

第一个好处、加密被传输的信息:当网站当中有信息传输,就需要加密这些信息,因为这样才可以防止信息被不法分子盗用,可以留住企业的重要机密。ssl双向认证之后,网站当中被传输的信息就会被加密,所以在传输的过程中不会被篡改,更不会被盗用。然后,信息就可以被安全的传输到目的地。

第二个好处、增加网站的信任度:如果网站值得信任,就会有更多的用户访问这个网站,这样网站的点击量就会增多。但是,很多网站当中的不安全警告比较多,导致很多人不信任该网站。ssl双向认证之后,网站当中不安全的警告是可以被消除的,这种情况下就能够增加网站的信任度,同时还可以让网站的点击量增多。

ssl双向认证

ssl认证流程有哪些:

ssl认证的好处有很多,能够加密被传输的信息,还可以在一定程度上增加网站的信任度。因此,网站进行ssl认证是很有必要的。但是,认证的时候一定要注意流程,按照正确的流程来认证才符合规定。那么,ssl认证流程有哪些呢?

首先,先去申请ssl证书,然后再将颁发的证书下载下来,直接配置在网站的服务器当中去。其次,创建CA私钥,紧接着需要创建ssl证书请求,将公钥创建好。最后,ssl认证就结束了。这就是ssl认证流程,通过这些流程去人在ssl证书,可以有效的提高网站的安全性。

ssl证书就是一种使用在网站服务器当中的证书,能够有效的保护网站信息安全,防止信息被不法分子盗用。因此,企业在保护网站的时候,就可以直接去申请ssl证书,然后配置到网站服务器当中去就可以了。

ssl证书哪里申请

以上是关于Netty中使用SSL 双向认证(包括证书生成)的主要内容,如果未能解决你的问题,请参考以下文章

如何生成自签名双向认证证书 ssl

国密证书双向认证客户端发送哪个

加密之SSL和单双向认证

双向认证SSL原理

NGINX 配置 SSL 双向认证

Tomcat配置HTTPS方式生成安全证书