当仅启用tls/ssl时,如何从mongo spark连接器到mongodb进行连接?
如何通过read Config中的URI和收集名称传递以与TLS/SSL启用MongoDB实例建立连接?
预先感谢?
要使SSL连接从Spark到Mongo服务器,您需要信任Mongo证书或已签署该证书的CA(证书授权)。这是最重要的部分,也是我最棘手的部分。
Spark是一个Java应用程序,因此它从JKS TrustStore获得证书。您将需要将Mongo证书(仅是公共部分)导入信托基地,以使其可用于Spark。这样做:
-
获取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
文件
中 - 将其导入信托基地 $ KEYTOOL -IMPORT -FILE/PATH/TO/YOUR/MONGODB.CRT -ALIAS MONGODB -KEYSTORE/PATH/TO/YOUR/TRUSTSTORE.JKS 输入密钥库密码:123456 ... ... 相信这个证书?[否]:是的 证书已添加到密钥店
- 确保密钥库是可从所有火花群集节点。
现在,您已导入服务器证书。如果您需要相互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