当只有TLS / ssl为mongo DB启用时,如何从mongo-spark连接器连接到mongodb?

时间:2017-02-27 12:55:45

标签: mongodb apache-spark

如果只为mongo DB启用了TLS / ssl,如何从mongo-spark连接器连接到mongodb?

如何在read config中传递uri和集合名称以与启用了TLS / ssl的mongodb实例建立连接?

提前谢谢?

1 个答案:

答案 0 :(得分:1)

要建立从Spark到Mongo服务器的ssl连接,您将需要信任Mongo证书或已对该证书签名的CA(证书颁发机构)。这是最重要的部分,也是我要弄清楚的最棘手的部分。

Spark是Java应用程序,因此它从jks trustStore获取证书。您将需要将Mongo证书(仅公共部分)导入truststore中,以使其可用于Spark。为此:

  1. 获取Mongo证书:请已设置mongo的DBA或系统管理员为您提供证书。其他方法是通过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=BBVA/OU=SEMAAS/CN=mongo.hostname.local
       i:/C=ES/ST=Madrid/L=Madrid/O=BBVA/OU=SEMAAS/CN=mongo.hostname.localIssuing CA 
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    [..... A bunch of base64 text....]
    -----END CERTIFICATE-----
    

    -----BEGIN CERTIFICATE----------BEGIN CERTIFICATE-----获取零件并将其保存在.cert文件中

  2. 将其导入到trustStore     $ keytool-导入-file /path/to/your/mongodb.crt -alias mongodb -keystore /path/to/your/trustStore.jks     输入密钥库密码:123456     ...     ...     信任此证书吗? [否]:是     证书已添加到密钥库中
  3. 确保密钥存储可从您的所有Spark集群节点中访问

现在,您已导入服务器证书。如果您需要相互TLS ,则需要提供有效的客户端证书。该证书和证书私钥应位于jks keyStore中(它可以与存储Mongo服务器证书的相同trustStore文件中,因为它使用相同的格式)。如果不打算使用双向TLS,则不需要这样做,但是,您必须检查MongoDB实例是否能够接受没有客户端证书的连接。这是带有标志sslAllowConnectionsWithoutCertificates

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

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

现在您可以胜任您的工作了。在完成工作时,我们还需要指定我们的trustStore的位置以及mongo连接器的库:

    /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

我们对驱动程序和执行程序使用extraJavaOptions来传递这些参数。如果您使用双向TLS,请包括以下额外的Java选项:

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

/path/to/your/keyStore.jks是存储客户端证书的位置。

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

希望对您有帮助!

来源: https://github.com/brunocfnba/spark-mongo-ssl https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.5.5/bk_spark-component-guide/content/spark-encryption.html https://community.hortonworks.com/articles/147113/how-to-configure-your-spark-application-to-use-mon.html https://mapr.com/support/s/article/Unable-to-find-valid-certification-path-to-requested-target-error-while-accessing?language=en_US