【问题标题】:How does a Java client automatically accept a self-signed certificate from the serverJava 客户端如何自动接受来自服务器的自签名证书
【发布时间】:2012-03-17 18:50:20
【问题描述】:

我正在实现一个使用自签名证书的服务器。将证书分发给客户的最佳方式是什么?我可以将证书导入 java 密钥库并设置客户端。但是有什么办法可以避免每个客户手动导入证书。这可以由java客户端自动完成吗?我浏览了 JSSE 参考,但无法弄清楚如何做到这一点。将不胜感激。

问候, Sampath。

【问题讨论】:

  • 看到这个答案:stackoverflow.com/questions/2893819/…问候
  • @Sorin,在该问题的已接受答案中避免信任管理员。相反,应使用此答案中的方法:stackoverflow.com/a/859271/372643
  • 发帖前我确实看过。其中提到使用 keytool 导入证书。这是否意味着用户需要在机器上手动下载证书。我一直在寻找一种可以自动完成这种交换的方法。

标签: java ssl certificate self-signed


【解决方案1】:

查看KeyStore 课程。它允许您操作 Java 密钥库。

代码示例:

KeyStore ks = KeyStore.getInstance("JKS");  
ks.load(null, null);  // Creates a new keystore

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("cert.cer"));  // Or read from URL
CertificateFactory cf = CertificateFactory.getInstance("X.509");  
Certificate cert = null;  

if (bis.available() > 0) {  
  cert = cf.generateCertificate( bis );  
  ks.setCertificateEntry( "SGCert", cert );  
}  

ks.setCertificateEntry("SGCert", cert);  
ks.store(new FileOutputStream("out.keystore"), "secret".toCharArray() ); 

【讨论】:

  • 感谢您的示例。 cert.cer 来自哪里。一定要从服务器下载吗?
  • 我的格式错误:您可以滚动到右侧查看代码注释:// Or read from URL 您可以使用 URL 而不是文件名来读取证书。另一种方法是将证书包含在您的客户端安装程序中。
  • 我的错。应该已经完整阅读了。让我试试这种方法。再次感谢。
  • 抱歉挖掘了一个老问题。但是这样做的“正确”方法是什么?从 URL 获取证书会不会不安全?
  • @Dave 这在很大程度上取决于 URL 的来源。如果是来自外部输入,则有可能存在风险(取决于 Java 实现的强度)。
猜你喜欢
  • 2011-02-23
  • 2011-06-11
  • 1970-01-01
  • 2017-10-08
  • 2010-11-13
  • 2014-06-07
  • 2014-05-04
  • 2020-01-11
相关资源
最近更新 更多