我有一个用于spark的Java组件,它通过使用证书构建SSL来消耗soap服务。我在本地测试了组件,并从soap服务获得响应。
service = new Token_Service();
port = service.getPort(TokenLookupService.class);
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
jsonSpec.getEndpoint());
System.setProperty("https.protocols", "TLSv1.2");
System.setProperty("javax.net.ssl.keyStore","/path/to/my.jks");
System.setProperty("javax.net.ssl.keyStorePassword","mypswd");
System.setProperty("javax.net.ssl.keyStoreType","JKS");
// call the service
List<PANType> panFromToken = port.getPANFromToken(tokens);当我调试/逐步执行代码时,这很好。但是,当我运行spark-submit命令时,证书将不会被选中,并且我会得到403: Forbidden错误。我将代码更改为手动构建SSL上下文(如下所示)。它在本地/调试模式下运行良好,但在运行时我得到了null响应(编号403号)。
SSLContext sc = SSLContext.getInstance("TLSv1.2");
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
String certPath = "/path/to/my.jks";
String certPass = "myPassword";
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(certPath), certPass.toCharArray());
kmf.init(ks, certPass.toCharArray());
sc.init(kmf.getKeyManagers(), null, null);
((BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", sc.getSocketFactory()); 我试着用-- conf选项运行spark,但是参数错误无效。
--conf "-Djavax.net.ssl.keyStore=/path/to/my.jks" --conf "-Djavax.net.ssl.keyStorePassword=myPass"
发布于 2018-04-11 19:35:21
我注意到System.setProperty()没有在星星之火环境下工作。我是在本地进行测试,而不是在任何集群上进行测试,但是应该已经获得了系统属性。尽管如此,设置SSL套接字工厂仍然有效。
https://stackoverflow.com/questions/49762643
复制相似问题