我创建了一项服务来注册“https”协议(protocol)并使用 SocketFactory 实现将证书注入(inject)其中,一次只有一个请求正常工作,但使用多线程就像只注册一次,并且 Webservice SOAP 照原样错误的证书。 Webservice SOAP 类由 Axis 2 使用从页面保存的 WSDL 生成。
使用证书注册协议(protocol)的代码:
public boolean sign(InputStream pfx, final String password) throws Exception {
try {
InputStream in = new ByteArrayInputStream(getBytesFromInputStream(pfx));
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(in, password.toCharArray());
in.close();
Enumeration<String> aliases = ks.aliases();
String alias = null;
while (aliases.hasMoreElements()) {
alias = (String) aliases.nextElement();
if (ks.isKeyEntry(alias)) break;
}
X509Certificate certificate = (X509Certificate) ks.getCertificate(alias);
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray());
SocketFactoryDynamic socketFactoryDinamico = new SocketFactoryDynamic(certificate, privateKey);
socketFactoryDinamico.setFileCacerts("NFeCacerts");
Protocol.registerProtocol("https", new Protocol("https", socketFactoryDinamico, 443));
return true;
} catch (IOException | NoSuchAlgorithmException | CertificateException | KeyStoreException | UnrecoverableKeyException e) {
throw e;
}
}
我想在webservice中同时查询多个客户端,但是证书不同。
最佳答案
我所做的是围绕设置 Protocol.registerProtocol 和实际的 Axis2 调用添加一个同步块(synchronized block)。
synchronized (this) {
Protocol.registerProtocol("https", getHttpsProtocol());
SOAPEnvelope response = call.invoke(request, operationName, messageContext);
return response;
}
这样,当一个线程设置协议(protocol)时,其他线程就无法访问和设置它,直到 Axis2 调用完成并返回响应
希望这有帮助
关于java - 使用 SOAP 中请求的证书注册协议(protocol) "https"多线程(轴 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876290/