在Java中使用HTTPS进行SSL连接而无需证书

4

在Java中,是否有可能在不使用证书的情况下使用HttpURLConnection进行ssl操作?

我想要使用一个随机数或对称密钥。


所以你想要 SSL,但又不想要 SSL?这个问题没有意义。注意 SSL 已经使用对称密钥。 - user207421
6个回答

2
是的,您可以使用预共享密钥建立TLS连接,无需证书。
Clover发布了由Bouncy Castle提供支持的TLS PSK JSSE套接字工厂。
请参见https://github.com/clover?q=pskfactories 或者,WolfSSL似乎也有一个支持PSK的JSSE实现。不幸的是,它依赖于本地代码,因此可能需要更多的工作才能运行。除非购买商业许可证,否则它也是GPLv2。
请参见https://www.wolfssl.com/products/wolfssl-jni-jsse/

2

虽然SSL/TLS并不严格要求证书,但由于RFC 2818(特别是第3.1节)明确提到X.509证书,因此HTTPS需要证书。

有关更多详细信息,请参见ServerFault上的此答案,它与此问题非常相似。

如果没有证书,您所做的任何事情都将超出RFC 2818的范围,但这仍然可能有效(并有意义)。但是,其他实现支持的方式可能会有所不同。如果选择不使用证书,则仍需要一种方法来验证服务器的身份以确保通信的安全性。

编辑:

JSSE的Oracle提供程序不支持PSK密码套件(或OpenPGP证书)。最接近共享密钥的是Kerberos密码套件。


1
需要注意的是,RFC 2818在TLS引入这些替代方法之前很久就已经出现了。因此,RFC明确提到证书,因为当时没有其他可用的方法。此外,在PSK套件中,可以通过知道共享的密钥来确认服务器身份,或者通过信任OpenPGP密钥(当OpenPGP用于身份验证时)。 - Eugene Mayevski 'Callback
@EugeneMayevski'EldoSCorp,只是出于好奇,SecureBlackbox是否作为JSSE API的附加提供程序集成(从而使这些密码套件可用于传统Java应用程序),还是需要完全不同的API? - Bruno
是的,对于基本的加密,它可以胜任,但对于 SSL 和其他高级功能,有一个不同的 API 提供,更简单易用和更灵活。 - Eugene Mayevski 'Callback

1
不行,您需要证书才能通过HTTPS连接。您可以使用自签名证书来实现您的目的。

这个答案是不正确的,在2005年引入了预共享密钥TLS:https://datatracker.ietf.org/doc/html/rfc4279 - satur9nine

1

是的,您可以在SSL/TLS中使用多种不同的身份验证方法,包括对称密钥(PSK密码套件)和用户名/密码组合(SRP密码套件)。我无法确定Java内置机制,但我们的SecureBlackbox产品(包括其Java版本)允许您在SSL/TLS通道的客户端和服务器端使用上述机制。这也适用于提供的HTTPS客户端和服务器组件。


0

请查看以下问题的被接受答案:

如何在Apache HttpClient 4.0中忽略SSL证书错误

您只需要创建一个TrustManager,它基本上不检查任何内容,只信任所有内容。虽然我可以理解在开发过程中这很有用,但这确实有点否定了SSL的目的。TrustManager的作用是避免中间人攻击,其中第三方冒充服务器拦截和操纵数据等,因此如果您不验证服务器的证书,任何人都可以提供“无效”的证书!


2
那仍然使用证书(当然不安全)。问题似乎不想在安全性上妥协,而是想使用(预共享的)对称密钥。 - Bruno

-2

SSL需要证书,但是您可以像这样创建自签名证书:

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

这个证书将被存储在keystore.jks中,并且有效期为360天。

根据你的http服务器实现,通常可以通过提供keystoreFile参数和keystorePass来指向keystore以设置密码(属性名称取自Apache Tomcat的HTTP连接器,但它们在其他http服务器中也类似)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接