当前位置: 首页 > 面试题库 >

为什么在Java中创建SSL套接字时出现错误“无法存储非私有密钥”?

章建木
2023-03-14
问题内容

我正在使用旧版本的IBM iSeries(IBM-i,i5OS,AS / 400等),并在O / S版本V5R3M0上使用Java 5
JVM(经典,而不是ITJ J9)。

简而言之,这是场景:

  1. 我使用Portecle 1.7创建了类型为JKS的密钥库(注意:我确实尝试将密钥库转换为JCEKS,但由于不支持的格式而被拒绝,因此JKS是iSeries机器的唯一选择(至少我使用的版本)。
  2. 然后,我创建了密钥对和CSR,并将CSR发送给Thawte进行签名。
  3. 我成功地使用PKCS#7格式从Thawte导入了签名证书,以导入整个证书链,其中包括我的证书,Thawte中介和Thawte服务器根目录。

这一切都按预期进行。

但是,当我运行JVM时,将其正确配置为指向商店并提供它的密码(我过去使用在Portecle中创建的用于测试的自签名证书来完成此操作),然后尝试在443上启动Web服务器,我收到以下安全异常:

java.security.KeyStoreException: Cannot store non-PrivateKeys

谁能告诉我我哪里出了问题,或者接下来我要检查什么?


问题答案:

无需使用临时密钥库,您可以在单个中处理所有内容SSLContext

您需要SSLContext使用自定义来初始化您的自定义设置,X509KeyManager而不是使用default给出的自定义设置KeyManagerFactory。在此X509KeyManagerchooseServerAlias(String keyType, Principal[] issuers, Socket socket)应根据从套接字获得的本地地址返回不同的别名。

这样,您就不必担心将私钥从一个密钥库复制到另一个,这甚至适用于不能从中提取(并因此复制)但仅使用私钥的密钥库类型,例如PKCS #11。



 类似资料:
  • 问题内容: 我是新手,想学习ReactJS,所以我开始使用command 安装一个新的空文件夹。我有npm v.6.4.1。当我尝试执行命令时,它给了我一个错误。 我已经在Laravel空项目上执行了相同的命令,但是仍然给了我同样的错误。 您能告诉我主要的原因是什么以及如何解决这个问题? 编辑: 我已经以管理员身份运行终端,但是我收到另一个错误: 问题答案: 您是否尝试过以管理员身份运行它?

  • 我已经安装了一个新的版本的通过RVM和我试图安装rails()但是,当我收到以下错误: 错误:找不到有效的gem“rails”( 我遵循了rubygem上的SSL证书页面上的说明,但没有用。我能在rubygem中找到的每个证书似乎都与最新版本相匹配。 我还运行了,并收到以下错误:

  • 问题内容: 我正在加密服务器和客户端之间的TCP连接。在研究和测试过程中,我倾向于使用秘密密钥加密。我的问题是我找不到有关如何实现此功能的任何教程。我发现的教程围绕一次HTTP请求进行,我只需要一个SSL套接字。 我到目前为止编写的代码如下。我几乎可以肯定它需要扩展,我只是不知道该怎么做。任何帮助表示赞赏。 接受客户端连接的服务器代码 我只是不知道如何实际进行握手。 参考:http : //doc

  • 错误:任务“:app:preDebugAndroidTestBuild”的执行失败。 与项目': app'中的依赖项'com.android.support: support-注解'冲突。应用程序(26.1.0)和测试应用程序(27.1.1)的已解决版本不同。有关详细信息,请参阅https://d.android.c[在此处输入图像描述][1]om/r/tools/test-apk-depende

  • 我正试图在MySQL中创建一个存储过程,但我一直收到错误消息 #1064年的今天,您的SQL语法出现错误;查看与您的MariaDB服务器版本对应的手册,以了解第1行“DELIMITER”附近使用的正确语法 预期分隔符。(在位置10的“”附近) 我做错了什么?编辑:去掉错误后,现在我的程序只是插入空值,知道为什么吗?