【问题标题】:How to make connection from mongo-spark connector to mongodb when only TLS/ssl enable for mongo DB?当只有 TLS/ssl 为 mongo DB 启用时,如何从 mongo-spark 连接器连接到 mongodb?
【发布时间】:2017-02-27 12:55:44
【问题描述】:

mongo DB 仅启用 TLS/ssl 时如何从 mongo-spark 连接器连接到 mongodb?

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

提前谢谢?

【问题讨论】:

    标签: mongodb apache-spark


    【解决方案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=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. 将其导入 trustStore $ keytool -import -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 连接器库,您可能会遇到麻烦。 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

    【讨论】:

    • 使用 rds-combined-ca-bundle.pem 的人会生成一个密钥库并与 pyspark 连接。它行不通。您需要使用 rds-YYYY-ca ***.pem 文件,该文件将包含一个证书来生成密钥库,然后它将起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2021-02-22
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多