在尝试使用HttpClient调用使用自签名证书的https站点时,我有些困惑。我有如下代码,这使我可以拨打电话,但是随后出现错误,就像javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
我从Web浏览器下载了证书并了解可以将其导入密钥库一样,但我宁愿将其放入代码并以这种方式使用它,有没有办法做到这一点?
HttpClient client = new HttpClient();
EasySSLProtocolSocketFactory easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory();
Protocol https = new Protocol("https", easySSLProtocolSocketFactory,
443);
Protocol.registerProtocol("https", https);
BufferedReader br = null;
String responseString = "";
GetMethod method = new GetMethod(path);
int returnCode = client.executeMethod(method);
假设您的证书为PEM格式。您可以在代码中嵌入它,并使用BouncyCastle的的PEMReader
把它变成一个X509Certificate
实例。完成此操作后,KeyStore
在内存中创建一个实例,并将此X.509证书放入其中。然后,SSLContext
使用该实例化新的实例KeyStore
作为信任库,并让您的HTTP客户端使用它。
看起来像这样(未尝试过,请记住关闭读者并捕获异常...):
PEMReader pemReader = new PEMReader(new StringReader("----- BEGIN ......");
X509Certificate cert = (X509Certificate) pemReader.readObject();
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("some name", cert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, tmf.getTrustManagers(), null);
然后,将其SSLContext
用于连接。如果使用的是4.x版,则可以使用Apache HttpClient的SSLSocketFactory进行此操作(如果使用的是3.x版,则可以进行此操作)。我建议现在使用Apache HttpClient4.x。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句