我有一个用于spark的Java组件,它通过构建带有JKS证书的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"
答案 0 :(得分:0)
我注意到System.setProperty()在spark-context下无法正常工作。我在本地进行测试而不是在任何集群上进行测试,但是火花执行器应该已经获取了系统属性。尽管如此,设置SSL套接字工作仍然有效。