在Java中,是否有可能在不使用证书的情况下使用HttpURLConnection
进行ssl操作?
我想要使用一个随机数或对称密钥。
在Java中,是否有可能在不使用证书的情况下使用HttpURLConnection
进行ssl操作?
我想要使用一个随机数或对称密钥。
虽然SSL/TLS并不严格要求证书,但由于RFC 2818(特别是第3.1节)明确提到X.509证书,因此HTTPS需要证书。
有关更多详细信息,请参见ServerFault上的此答案,它与此问题非常相似。
如果没有证书,您所做的任何事情都将超出RFC 2818的范围,但这仍然可能有效(并有意义)。但是,其他实现支持的方式可能会有所不同。如果选择不使用证书,则仍需要一种方法来验证服务器的身份以确保通信的安全性。
编辑:
JSSE的Oracle提供程序不支持PSK密码套件(或OpenPGP证书)。最接近共享密钥的是Kerberos密码套件。
是的,您可以在SSL/TLS中使用多种不同的身份验证方法,包括对称密钥(PSK密码套件)和用户名/密码组合(SRP密码套件)。我无法确定Java内置机制,但我们的SecureBlackbox产品(包括其Java版本)允许您在SSL/TLS通道的客户端和服务器端使用上述机制。这也适用于提供的HTTPS客户端和服务器组件。
请查看以下问题的被接受答案:
如何在Apache HttpClient 4.0中忽略SSL证书错误
您只需要创建一个TrustManager,它基本上不检查任何内容,只信任所有内容。虽然我可以理解在开发过程中这很有用,但这确实有点否定了SSL的目的。TrustManager的作用是避免中间人攻击,其中第三方冒充服务器拦截和操纵数据等,因此如果您不验证服务器的证书,任何人都可以提供“无效”的证书!
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服务器中也类似)。