
正文
java双向证书请求代码 https 双向证书
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Netty中使用SSL 双向认证(包括证书生成)
双向证书认证的双方称为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
具体实现请参考附件源码。
附录:
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
相关问答
Q1: java怎么去调用tomcat6配置使用ssl双向认证
客户端的JAVA导入ROOT证书、客户端证书,,,,然后指定使用SSL,就可以
Q2: 1+xjava证书编码
1+X职业技能等级证书编码采用24位数字编码结构。
1.第1位为证书类型代码,面向职业院校在校学生java双向证书请求代码的职业技能等级证书取值为1,面向社会成员的职业技能等级证书取值为2。
2.第2-7位为证书对应的职业技能等级标准代码,表示标准主要面向的职业技能领域。
3.第8-10位为开发职业技能等级证书的职业教育培训评价组织代码。
4.第11-12位为证书等级及拓展代码java双向证书请求代码,其中第11位为等级代码,初级为1,中级为2,高级为3;第12位为预留的等级拓展位,目前统一暂定为5;未来可限据需要拓展,如在初级中拓展一级、二_等。
5.第13-14位为考核站点所在区域代码,取值见区域代码对照表。
6.第1b750位为所在区域内考核站点序列号,由三位数字(不足三位时在前面加零补足r组成%.尔同区域份别从0C开始编排,
7.第18-19位为证书考核年份代码,如2019年考核证书的年份代码为19,2020年考核证书的年份代码为20,以此类推n
8.第20-24位为证书核发序列号,按照每年度该考核站点考核通过的证书各等级从000-99999依次顺序取值。
以上第1、4、b、6、1、8条有关编码由培训评价组织根据规则确定,第2、3条由教育部职业技术教育中心研究所赋码。
Q3: java怎么模拟https双向认证但客户端只有ukey的请求
对于不是优盘的ukey,一般都有驱动程序的。用正确的api就可以不导入直接使用。
Q4: java 建立双向认证 https连接
绝对好用java双向证书请求代码的。直用的这个java双向证书请求代码,GOOD LUCK FOR YOU
public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象java双向证书请求代码,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect();
// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式java双向证书请求代码,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
System.out.println("返回的数据java双向证书请求代码:"+buffer.toString());
// jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("Weixin server connection timed out.");
} catch (Exception e) {
log.error("https request error:{}", e);
}
return buffer.toString();
}
java双向证书请求代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于https 双向证书、java双向证书请求代码的信息别忘了在本站进行查找喔。







