使用 SSL 对 MQTT的消息交换进行加密,提高安全性。
- 服务端使用的是 EMQ v2.0
- 客户端使用的是 Eclipse Paho Android Service
服务器启用SSL
我们需要数字证书来对进行ssl通信用户进行强认证。由于获得一个真正受外界信任的证书需要花费money,所有我们采用自签名证书。
要实现双向认证(服务器认证客户端、客户端认证服务器)我们需要3个证书,一个CA证书,一个EMQ服务器证书,一个客户端证书。
具体的生成证书操作、启用EMQ ssl和双向认证,参考这篇文章 Securing EMQ Connections with SSL
android客户端的ssl实现
上一步我们生成了客户端使用的证书 MyClient1.pem
和私有秘钥MyClient1.key
,但是要想在android上使用需要将其转成bks
格式。
pem 转 bks
1、首先生成.p12
文件:
1 | openssl pkcs12 -export -nodes -in MyClient1.pem -inkey MyClient1.key -out client.p12 |
-inkey
为私钥文件-in
为证书,如果pem私钥没有密码,则使用-nodes
表示无密码,如果有密码使用-passin
;如果私钥和证书都在同一文件里则-in
和-inkey
指定同一个文件。
会提示输入给.p12秘钥库设置的密码,请记住,下面会用到
2、生成.bks
证书:
1 | keytool -importkeystore -srckeystore client.p12 -srcstoretype pkcs12 -destkeystore client.bks -deststoretype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-158.jar |
使用 KeyTool 转换为 BKS 格式时,需要 bcprov-ext-jdk15on-158.jar
,可以在 这里 找到。文件路径直接带在-providerpath
参数后面即可。也可以把jar包放到如下路径:jdk/jre/lib/ext
,从而省略-providerpath
。
会首先提示输入给bks秘钥库设置的密码,请记住,下面会用到。
然后会提示输入p12秘钥库密码,即上一步设置的密码。
3、查看bks证书库列表进行验证1
keytool -list -rfc -keystore client.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 'bks秘钥库密码'
源码
完整源码见 GitHub
主要代码
1 | package paho.android.mqtt_example; |