【发布时间】:2012-08-14 19:09:35
【问题描述】:
我的任务是使用 HTTPS 保护(以前是 HTTP)Web 服务。从一个现已离职的同事那里,我继承了在我们现有服务器的 TCP 和 HTTP 层之间插入 SSLEngine 对象的代码。据我所知,这段代码可以正常工作。我从SSLContext.createSSLEngine() 得到SSLEngine,但是如何生成合适的SSLContext 让我感到困惑。
SSLEngine 本身在其 javadoc 中有一个漂亮的概念介绍,但不幸的是我不需要需要与自己交互的部分。另一方面,SSLContext.init() 的文档很少,只是说我必须通过“身份验证密钥的来源”和“对等身份验证信任决策的来源”,我不知道那是什么。这些参数类型的文档(通常我下次尝试理解它)是通用的,以至于什么都不说,SSLContext 的类文档也很简短。
我得到了一堆 ascii-armored .crt、.pem 和 .key 文件,它们共同使 Apache 能够在 Java 服务器最终将直接处理的域中提供 HTTPS。我想我需要以某种方式将它们加载到SSLContext 或SSLEngine,但不确定SSLContext.init() 是否是正确的地方(尽管似乎没有很多其他地方可以是)。
我应该开始阅读哪些文档以了解如何做到这一点?
我的 Google 尝试生成了许多质量和安全性未知的半未记录示例代码,以及一些高级演练,例如“如何编写自己的密钥提供程序”,但没有对 进行全面的概念介绍最基本的 JRE 类的使用。
特别是因为这与安全相关,所以我不会使用复制粘贴示例代码,我只会漫无目的地敲打,直到它似乎或多或少地做我想要的。我需要对各个部分实际上应该如何组合在一起的高级概念理解。
(如果文档足够详细,可以让我弄清楚如何在实践中进行 SSL 客户端授权,则可以加分——但这并不是立即紧急的)。
【问题讨论】:
-
SSLContext 文档表明所有指定给 init() 的参数都可以为空。您是否尝试过将其传递为空值并查看其行为方式?
-
你的网络服务是 JEE 战争吗?
-
好的,一件一件的。 SSLContext 是 SSLContextSPI 的包装器,例如它包含常用方法,以使用服务提供者。 KeyManager 为上下文提供它自己的私钥。 TrustManager 为上下文提供它可以信任的公钥(例如,您可以使用它来进行客户端身份验证)
-
@Wug:是的,我可以传递 null。但我肯定必须以某种方式告诉 JRE 在哪里可以找到它应该授权给客户端的证书。
-
@kw4nta:如果
SSLContext包装了SSLContextSPI,那么它会私下进行。没有公共方法可以用来解决后者,即使我知道如何处理它。
标签: java ssl ssl-certificate