Mysql SSL客户端认证和JMX over SSL设置的密钥库中的多个证书



我的Java应用程序需要通过SSL客户端身份验证到Google cloud Mysql实例。它的客户端密钥和证书由Google提供。我还需要在同一应用程序上设置带有SSL的JMX代理,该应用程序的证书由私有CA提供。

如果我将两个私有证书添加到启动时提供给JVM的单个密钥库中,如何防止Mysql呈现JMX证书,反之亦然

是否有其他的方法来验证SSL证书与Mysql除了放在'javax.net.ssl.keyStore'?如果没有,是否有Mysql或JMX代理更喜欢的别名?

您可以查看使用Cloud SQL MySQL套接字工厂,它使用临时SSL证书对Cloud SQL进行身份验证(仅支持第二代实例):

https://github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory

MySQL使用SSL安全连接

要使SSL支持工作,您必须具备以下条件:

  1. 包含JSSE (Java安全套接字扩展)的JDK,如JDK-1.4.1或更新版本。SSL目前不能与可以添加JSSE的JDK一起工作,如JDK-1.2.xJDK-1.3.x,由于以下JSSE错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4273544

  2. 一个MySQL服务器,支持SSL,并已编译和配置这样做,这是MySQL 4.0.4 or later。有关更多信息,请参见构建支持安全连接的MySQL。

客户端证书(在本节中讨论)


如何使用多个密钥仓库?

测试证书驻留在名为node1.keystore … node100.keystore的密钥库中,它是按照创建自签名测试证书中描述的步骤创建的。

  1. 导出node1.example.com的测试证书:

    $ keytool -exportcert -keystore node1.keystore -alias node1 
    -storepass changeme -file node1.cer
    
  2. 将测试证书导入自定义信任库:

    keytool -importcert -keystore custom.truststore -alias node1 
    -storepass trustchangeme -file node1.cer -noprompt
    

    这里我们指定-noprompt选项来抑制提示询问您需要确认证书是可信的。因为你

  3. node2.keystore … node100.keystore重复步骤1和2。

资源链接:

  1. 创建Java密钥库和信任库

密钥库和信任库详细信息:

密钥存储库以两种不同的方式使用:

  1. keystore包含TLS/SSL服务器使用的私钥和证书,用于向TLS/SSL客户端验证自己。按照惯例,这些文件被称为密钥库。
  2. 当用作truststore时,该文件包含受信任的TLS/SSL服务器的证书,或受信任的证书颁发机构的证书,以识别服务器。信任存储库中没有私钥。

由于密钥库包含私钥,而信任库不包含私钥,因此对密钥库的安全性要求更为严格。特别是:

  1. Hadoop TLS/SSL要求truststore和truststore密码以明文形式存储在所有人都可读的配置文件中。
  2. 密钥库和密钥密码以明文形式存储在一个文件中,该文件只能由相应组的成员读取。

这些注意事项应该告诉您选择将哪些密钥和证书存储在将在整个集群中部署的密钥库和信任库中。

  1. 密钥库应该包含一组最小的密钥和证书。合理的策略是为每台主机创建唯一的密钥存储库,其中只包含主机上运行的Hadoop TLS/SSL服务所需的密钥和证书。在大多数情况下,密钥存储库将包含单个密钥/证书条目。
  2. 修改密钥库:如果对密钥库进行了更改,必须重新启动CDH服务和进程。但是,这是相对罕见的,因为当主机从集群中添加或删除时,不需要更新密钥库。

  3. 由于信任存储库不包含敏感信息,因此为整个集群创建单个信任存储库是合理的。在生产集群上,这样的信任库通常包含单个CA证书(或证书链),因为您通常会选择由单个CA颁发所有证书。

重要:不要对truststores和keystores/keys使用相同的密码。

由于truststore密码存储在所有人都可读的文件中,因此这样做将危及密钥存储库中私钥的安全性。

最新更新