【发布时间】:2017-02-27 12:55:44
【问题描述】:
mongo DB 仅启用 TLS/ssl 时如何从 mongo-spark 连接器连接到 mongodb?
如何在读取配置中传递 uri 和集合名称以与启用 TLS/ssl 的 mongodb 实例建立连接?
提前谢谢?
【问题讨论】:
标签: mongodb apache-spark
mongo DB 仅启用 TLS/ssl 时如何从 mongo-spark 连接器连接到 mongodb?
如何在读取配置中传递 uri 和集合名称以与启用 TLS/ssl 的 mongodb 实例建立连接?
提前谢谢?
【问题讨论】:
标签: mongodb apache-spark
要建立从 Spark 到 Mongo 服务器的 ssl 连接,您需要信任 Mongo 证书或已签署该证书的 CA(证书颁发机构)。这是最重要的部分,也是我最难弄清楚的部分。
Spark 是一个 Java 应用程序,因此它从 jks trustStore 获取证书。您需要将 Mongo 证书(仅公共部分)导入到 trustStore 以使其可用于 spark。这样做:
获取 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 文件中
现在,您已导入服务器证书。如果您需要双向 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
【讨论】: