签发SSL多域名自签证书
<p>本文章在CentOS7下操作通过.</p><p>多域名证书 , 有两种配置方式 : </p>
<p><strong>1 . 使用openssl.cnf进行配置</strong></p>
<p><strong>2 . 直接命令行内内置生成</strong></p>
<p> </p>
<p>下面使用一个例子 , 来具体说明一下两种方式的做法 .</p>
<p> </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> </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> </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 <(cat /etc/pki/tls/openssl.cnf<(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> </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> </p>
<p><strong>三 . 生成服务器端证书 - 使用配置文件方式生成</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> </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> </p>
<p><strong>四 . 生成客户端证书 - 使用命令行直接生成</strong></p>
<p> 注意 : 配置中的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 <(cat /etc/pki/tls/openssl.cnf<(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 <(cat /etc/pki/tls/openssl.cnf<(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> </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> </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 > 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> </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 > 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> </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 >> " +<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> </p>
<pre> -sha256 -days 3650</pre><br><br>
来源:https://www.cnblogs.com/kreo/p/13203973.html
頁:
[1]