勘探营地 發表於 2020-6-28 17:56:00

签发SSL多域名自签证书

<p>本文章在CentOS7下操作通过.</p>
<p>多域名证书 , 有两种配置方式 :&nbsp;</p>
<p><strong>1 . 使用openssl.cnf进行配置</strong></p>
<p><strong>2 . 直接命令行内内置生成</strong></p>
<p>&nbsp;</p>
<p>下面使用一个例子 , 来具体说明一下两种方式的做法 .</p>
<p>&nbsp;</p>
<p><strong>一 . 复制并修改openssl配置文件(openssl.cnf)</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">CentOS的配置文件在/etc/pki/tls/下</span>
mv /etc/pki/tls/openssl.cnf ./</pre>
</div>
<p>修改配置文件并保存.</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">这3个是取消注释并修改</span>
copy_extensions =<span style="color: rgba(0, 0, 0, 1)"> copy
req_extensions </span>=<span style="color: rgba(0, 0, 0, 1)"> v3_req
subjectAltName </span>= @<span style="color: rgba(0, 0, 0, 1)">alt_names
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">新增alt_names节点并配置需要的域名和IP</span>
<span style="color: rgba(0, 0, 0, 1)">
DNS.</span>1 = *<span style="color: rgba(0, 0, 0, 1)">.org.example.com
DNS.</span>2 = *<span style="color: rgba(0, 0, 0, 1)">.abc.com
IP.</span>1 = 127.0.0.1<span style="color: rgba(0, 0, 0, 1)">
IP.</span>2 = 2.0.12.10</pre>
</div>
<p>&nbsp;</p>
<p><strong>二 . 生成根证书(CA) - 使用配置文件方式生成</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">生成CA key文件</span>
openssl genrsa -out ca.key 2048

<span style="color: rgba(0, 128, 0, 1)">#使用配置文件</span><span style="color: rgba(0, 128, 0, 1)">生成自签名CA证书</span>
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650<span style="color: rgba(0, 0, 0, 1)"> \
    </span>-subj <span style="color: rgba(128, 0, 0, 1)">"/C=CN/ST=ZHEJIANG/L=HANGZHOU/O=WANMA/OU=COMPANY/CN=127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
    </span>-config ./openssl.cnf -<span style="color: rgba(0, 0, 0, 1)">extensions v3_req \
    </span>-out ca.pem</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 直接命令行生成ca.pem , 该命令可以不用复制openssl.cnf</span>
opensslreq -x509 -new -nodes -key ./<span style="color: rgba(0, 0, 0, 1)">ca.key -sha256 -days 3650 \
    </span>-subj <span style="color: rgba(128, 0, 0, 1)">"/C=CN/ST=ZHEJIANG/L=HANGZHOU/O=WANMA/OU=COMPANY/CN=127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
    </span>-<span style="color: rgba(0, 0, 0, 1)">reqexts SAN \
    </span>-config &lt;(cat /etc/pki/tls/openssl.cnf&lt;(printf <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n\nsubjectAltName=DNS:*.abc.com,IP:0.0.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)) \
    </span>-out ca.pem</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用这个命令可以查看生成的CA证书是否支持多域名</span>
openssl x509 -text -<span style="color: rgba(0, 0, 255, 1)">in</span> ca.pem -noout</pre>
</div>
<p>&nbsp;</p>
<p><strong>三 . 生成服务器端证书&nbsp;- 使用配置文件方式生成</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">生成Server端 Key文件</span>
openssl genrsa -out server.key 2048

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">生成签名请求</span>
openssl req -new -key ./<span style="color: rgba(0, 0, 0, 1)">server.key \
    </span>-subj <span style="color: rgba(128, 0, 0, 1)">"/C=CN/ST=ZHEJIANG/L=HANGZHOU/O=WANMA/OU=COMPANY/CN=127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
    </span>-config ./openssl.cnf -<span style="color: rgba(0, 0, 0, 1)">extensions v3_req \
    </span>-<span style="color: rgba(0, 0, 0, 1)">out server.csr

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用CA证书签名Server端证书</span>
openssl x509 -req -<span style="color: rgba(0, 0, 255, 1)">in</span> ./server.csr -CA ca.pem -CAkey ca.key -<span style="color: rgba(0, 0, 0, 1)">CAcreateserial \
    </span>-extfile ./openssl.cnf -<span style="color: rgba(0, 0, 0, 1)">extensions v3_req \
    </span>-days 3650 -sha256 -out server.pem</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用这个命令可以查看生成的Server端证书是否支持多域名</span>
openssl x509 -text -<span style="color: rgba(0, 0, 255, 1)">in</span> server.pem -noout</pre>
</div>
<p>&nbsp;</p>
<p><strong>四 . 生成客户端证书 - 使用命令行直接生成</strong></p>
<p>&nbsp;注意 : 配置中的DNS和IP,没有配置文件中的.1 .2</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">生成Client端 Key文件</span>
openssl genrsa -out client.key 2048

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">生成签名请求 - 直接嵌入命令方式</span>
openssl req -new -key ./<span style="color: rgba(0, 0, 0, 1)">client.key \
    </span>-subj <span style="color: rgba(128, 0, 0, 1)">"/C=CN/ST=ZHEJIANG/L=HANGZHOU/O=WANMA/OU=COMPANY/CN=127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
    </span>-<span style="color: rgba(0, 0, 0, 1)">reqexts SAN \
    </span>-config &lt;(cat /etc/pki/tls/openssl.cnf&lt;(printf <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n\nsubjectAltName=DNS:*.org.example.com,DNS:*.abc.com,IP:127.0.0.1,IP:2.0.12.10</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)) \
    </span>-<span style="color: rgba(0, 0, 0, 1)">out client.csr

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用CA证书签名Client端证书</span>
openssl x509 -req -<span style="color: rgba(0, 0, 255, 1)">in</span> ./client.csr -CA ca.pem -CAkey ca.key -<span style="color: rgba(0, 0, 0, 1)">CAcreateserial \
    </span>-<span style="color: rgba(0, 0, 0, 1)">extensions SAN \
    </span>-extfile &lt;(cat /etc/pki/tls/openssl.cnf&lt;(printf <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n\nsubjectAltName=DNS:*.org.example.com,DNS:*.abc.com,IP:127.0.0.1,IP:2.0.12.10</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)) \
    </span>-days 3650 -sha256 -out client.pem</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用这个命令可以查看生成的Server端证书是否支持多域名</span>
openssl x509 -text -<span style="color: rgba(0, 0, 255, 1)">in</span> client.pem -noout</pre>
</div>
<p>&nbsp;</p>
<p><strong>五 . 转成jks证书(Java相关的程序使用 , 带密码,安全一点)</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">CA根证书生成 , 相当于把 ca.pem &gt; ca.jks</span>
keytool -import -noprompt <span style="color: rgba(0, 128, 128, 1)">-file</span> ca.pem -keystore ca.jks -storepass capassword</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">Client证书生成 , 相当于 client.key + client.pem &gt; client.jks</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">首先需要先转成p12格式的证书</span>
openssl pkcs12 -export -<span style="color: rgba(0, 0, 255, 1)">in</span> client.pem -inkey client.key -out client.p12 -<span style="color: rgba(0, 0, 0, 1)">passout pass:clientpassword

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">把p12证书转成jks证书 , 密码就不改了</span>
keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -destkeystore client.jks -srcstorepass clientpassword -deststorepass clientpassword</pre>
</div>
<p>&nbsp;</p>
<p><strong>六 . Java中调用jks证书例子(以paho.client.mqttv3.MqttClient为例子)</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> test.mqtt;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.eclipse.paho.client.mqttv3.MqttClient;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.eclipse.paho.client.mqttv3.MqttConnectOptions;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.eclipse.paho.client.mqttv3.MqttException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.eclipse.paho.client.mqttv3.internal.security.SSLSocketFactoryFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Properties;

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* </span><span style="color: rgba(128, 128, 128, 1)">@author</span><span style="color: rgba(0, 128, 0, 1)"> kreo
* @description
* @date 2020-6-23 23:15:16
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MqttConnection {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> String broker = "ssl://2.0.12.10:8883"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> String clientId = "LOCAL_JAVA_CLIENT"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> MemoryPersistence persistence = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryPersistence();

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> MqttClient client;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> MqttClient getClient() {
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (client == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                client </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MqttClient(broker, clientId, persistence);

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> MQTT 连接选项</span>
                MqttConnectOptions connOptions = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MqttConnectOptions();
                connOptions.setUserName(</span>"guest"<span style="color: rgba(0, 0, 0, 1)">);
                connOptions.setPassword(</span>"123456"<span style="color: rgba(0, 0, 0, 1)">.toCharArray());
                Properties sslProperties </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Properties();
                sslProperties.put(SSLSocketFactoryFactory.KEYSTORE, </span>"/usr/var/certs/client.jks"<span style="color: rgba(0, 0, 0, 1)">);
                sslProperties.put(SSLSocketFactoryFactory.KEYSTOREPWD, </span>"client.wanmagroup.com"<span style="color: rgba(0, 0, 0, 1)">);
                sslProperties.put(SSLSocketFactoryFactory.KEYSTORETYPE, </span>"JKS"<span style="color: rgba(0, 0, 0, 1)">);

                sslProperties.put(SSLSocketFactoryFactory.TRUSTSTORE, </span>"/usr/var/certs/ca.jks"<span style="color: rgba(0, 0, 0, 1)">);
                sslProperties.put(SSLSocketFactoryFactory.TRUSTSTOREPWD, </span>"wanmagroup.com"<span style="color: rgba(0, 0, 0, 1)">);
                sslProperties.put(SSLSocketFactoryFactory.TRUSTSTORETYPE, </span>"JKS"<span style="color: rgba(0, 0, 0, 1)">);
                sslProperties.put(SSLSocketFactoryFactory.CLIENTAUTH, </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);

                connOptions.setSSLProperties(sslProperties);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保留会话</span>
                connOptions.setCleanSession(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置回调</span>
                client.setCallback(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OnMessageCallback());

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 建立连接</span>
                System.out.println("尝试建立连接... Broker &gt;&gt; " +<span style="color: rgba(0, 0, 0, 1)"> broker);
                client.connect(connOptions);

                System.out.println(</span>"建立连接成功"<span style="color: rgba(0, 0, 0, 1)">);
            }
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (MqttException me) {
            System.out.println(</span>"原因代码 " +<span style="color: rgba(0, 0, 0, 1)"> me.getReasonCode());
            System.out.println(</span>"信息 " +<span style="color: rgba(0, 0, 0, 1)"> me.getMessage());
            System.out.println(</span>"LOC " +<span style="color: rgba(0, 0, 0, 1)"> me.getLocalizedMessage());
            System.out.println(</span>"原因 " +<span style="color: rgba(0, 0, 0, 1)"> me.getCause());
            me.printStackTrace();
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> client;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> close() {
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            client.disconnect();
            System.out.println(</span>"断开连接"<span style="color: rgba(0, 0, 0, 1)">);
            client.close();
            System.out.println(</span>"连接关闭"<span style="color: rgba(0, 0, 0, 1)">);
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (MqttException me) {
            System.out.println(</span>"原因代码 " +<span style="color: rgba(0, 0, 0, 1)"> me.getReasonCode());
            System.out.println(</span>"信息 " +<span style="color: rgba(0, 0, 0, 1)"> me.getMessage());
            System.out.println(</span>"LOC " +<span style="color: rgba(0, 0, 0, 1)"> me.getLocalizedMessage());
            System.out.println(</span>"原因 " +<span style="color: rgba(0, 0, 0, 1)"> me.getCause());
            me.printStackTrace();
      }

    }
}</span></pre>
</div>
<p>&nbsp;</p>
<pre> -sha256 -days 3650</pre><br><br>
来源:https://www.cnblogs.com/kreo/p/13203973.html
頁: [1]
查看完整版本: 签发SSL多域名自签证书