为什么火花没有选择证书?

时间:2018-04-10 20:49:11

标签: java apache-spark

我有一个用于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"

1 个答案:

答案 0 :(得分:0)

我注意到System.setProperty()在spark-context下无法正常工作。我在本地进行测试而不是在任何集群上进行测试,但是火花执行器应该已经获取了系统属性。尽管如此,设置SSL套接字工作仍然有效。