我们在给定的网址https://<上发布了一项网络服务fakeURL> .com?service.wsdl
为了制作Java客户端, 1)我从Firefox下载了.crt文件作为导出证书>>保存到文件>>它会自动使用.crt扩展名。
2)我在Java程序中使用了.crt文件并将其设置在SSLContextFactory中并制作了HttpsURLConnection并能够发布数据并获得结果。
InputStream certstream = fullStream ("path to .crt file /ABC.crt");
Certificate certs = cf.generateCertificate(certstream);
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("isakey", certs);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
URL url;
HttpsURLConnection urlConn;
url = new URL("https://path to web service /");
String rawData = "param1=abc¶m2=efg";
byte[] postData = rawData.getBytes(StandardCharsets.UTF_8);
urlConn = (HttpsURLConnection) url.openConnection();
urlConn.setSSLSocketFactory(sslSocketFactory);
InputStream certstream = fullStream ("path to .crt file /ABC.crt");
Certificate certs = cf.generateCertificate(certstream);
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("isakey", certs);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
URL url;
HttpsURLConnection urlConn;
url = new URL("https://path to web service /");
String rawData = "param1=abc¶m2=efg";
byte[] postData = rawData.getBytes(StandardCharsets.UTF_8);
urlConn = (HttpsURLConnection) url.openConnection();
urlConn.setSSLSocketFactory(sslSocketFactory);
根据我的理解,上面的代码是读取证书并将其包装在每个请求中。
在管理层要求我与其他同时也是同一Web服务的消费者团队共享证书之前,情况一切正常。
其他团队使用.NET C#连接到WS。
我分享后,.NET团队让我分享私钥。
现在我想知道因为
1)根据我的理解,他们可以问公钥..不是私钥。因为私钥是服务器拥有的并且是保密的。 2)通过firefox导出证书时,如果公共密钥附加了它,则包含密钥。我看到没有启用该选项。 所以这个证书中没有公钥。
3)其他团队说,因为他们的客户端是在.NET中而且它不接受.crt文件,它只接受.pfx文件。有可能吗?是证书格式技术依赖。
即使他们说只接受.pfx文件,他们也必须使用自己的私钥将.crt文件转换为.pfx。 有一些命令可以将crt文件转换为pfx,但我认为这个.NET团队必须使用自己的私钥
将PEM证书文件和私钥转换为PKCS#12(.pfx .p12)
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
其中privateKey.key是私钥。
有人能帮我理解他们的情况吗?