当仅tls/ssl启用Mongo db时,如何将连接从Mongo-Spark连接器到MongoDB



当仅启用tls/ssl时,如何从mongo spark连接器到mongodb进行连接?

如何通过read Config中的URI和收集名称传递以与TLS/SSL启用MongoDB实例建立连接?

预先感谢?

要使SSL连接从Spark到Mongo服务器,您需要信任Mongo证书或已签署该证书的CA(证书授权)。这是最重要的部分,也是我最棘手的部分。

Spark是一个Java应用程序,因此它从JKS TrustStore获得证书。您将需要将Mongo证书(仅是公共部分)导入信托基地,以使其可用于Spark。这样做:

  1. 获取Mongo证书:询问已设置Mongo的DBA或Sysadmin向您提供证书。另一个无处不在的是用openssl:

    $ openssl s_client -connect mongodb:27017
    CONNECTED(00000003)
    depth=0 C = ES, ST = Madrid, L = Madrid, O = HOME, OU = HOME, CN=mongodb mongo.hostname.local
    verify error:num=19:self signed certificate in certificate chain
    verify return:0
    ---
    Certificate chain
     0 s:/C=ES/ST=Madrid/L=Madrid/O=COMPANY/OU=AREA/CN=mongo.hostname.local
       i:/C=ES/ST=Madrid/L=Madrid/O=COMPANY/OU=AREA/CN=mongo.hostname.localIssuing CA 
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    [..... A bunch of base64 text....]
    -----END CERTIFICATE-----
    

    将零件从-----BEGIN CERTIFICATE-----转到-----BEGIN CERTIFICATE-----并将其保存在.cert文件

  2. 将其导入信托基地 $ KEYTOOL -IMPORT -FILE/PATH/TO/YOUR/MONGODB.CRT -ALIAS MONGODB -KEYSTORE/PATH/TO/YOUR/TRUSTSTORE.JKS 输入密钥库密码:123456 ... ... 相信这个证书?[否]:是的 证书已添加到密钥店
  3. 确保密钥库是可从所有火花群集节点

现在,您已导入服务器证书。如果您需要相互tls 需要提供有效的客户端证书。该证书和证书私钥应在JKS密钥库中(它可以在您存储的Mongo服务器证书的同一信托店文件中,因为它使用了相同的格式)。如果不使用相互tls,则无需执行此操作,> 您必须检查MongoDB实例是否可以接受没有客户端证书的连接。这是标志sslAllowConnectionsWithoutCertificates

下一步是在您要使用TLS的连接URI中指定。这很简单,只需将?ssl=true添加到您的连接字符串中即可。因此,连接URI将是这样的

mongodb://user:pw@host:port/db.collection?ssl=true

现在您可以峰会。登上工作时,我们还需要指定信托店的位置以及Mongo Connector的库:

    /spark/bin/spark-submit 
        --master spark://spark-master:7077 
        --packages org.mongodb.spark:mongo-spark-connector_2.11:2.2.0 
        --conf spark.executor.extraJavaOptions="-Djavax.net.ssl.trustStore=/path/to/your/trustStore.jks -Djavax.net.ssl.trustStorePassword=yourPassword" 
        --conf spark.driver.extraJavaOptions="-Djavax.net.ssl.trustStore=/path/to/your/trustStore.jks -Djavax.net.ssl.trustStorePassword=yourPassword" 
        /yourJob.jar

我们使用extlejavaoptions供驱动程序和执行者传递这些参数。如果您使用的是相互TLS,请包括以下额外的Java选项:

    -Djavax.net.ssl.keyStore=/path/to/your/keyStore.jks
    -Djavax.net.ssl.keyStorePassword=yourPassword

/path/to/your/keyStore.jks是您存储客户端证书的地方。

如果尚未安装火花连接器库,您可能会遇到麻烦。火花过程将用于Maven下载库,但是它将无法验证Maven证书,因为我们仅使用证书指定了另一个密钥库。一个解决方法是将我们的证书直接导入位于$JAVA_HOME/jre/lib/security/cacerts的默认密钥库中。默认密码是changeit。请记住在每个工人节点也要执行此操作。

我希望它有帮助!

来源:https://github.com/brunocfnba/spark-mongo-sslhttps://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.5.5/bk_spark-component-guide/content/content/spark-encryption.htmlhttps://community.hortonworks.com/articles/147113/how-to-to-configure-your-spark-application-to-use-use-mon.htmlhttps://mapr.com/support/s/article/unable-to-find-valid-certification-path-path-to-requested-target-target-error-eror-ror-while-while-accessing?language= en_us

最新更新