如果只为mongo DB启用了TLS / ssl,如何从mongo-spark连接器连接到mongodb?
如何在read config中传递uri和集合名称以与启用了TLS / ssl的mongodb实例建立连接?
提前谢谢?
答案 0 :(得分:1)
要建立从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=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
文件中
现在,您已导入服务器证书。如果您需要相互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