首先,对不起,我的英语不好。这是我的第一个问题。
我正在尝试用自签名证书连接windows中的android和Mosquitto broker。我成功地用我的自签名证书( ca.crt,server.key,server.crt,client.key,client.crt )连接了蚊子经纪人和mosquitto_pub
broker配置文件:
port 8883
cafile : ~~~/ca.crt.pem
keyfile : ~~~/server.key.pem
certfile : ~~~/server.crt.pem
tls_version tlsv1.2
require_certificate true发布命令:
mosquitto_pub -h ~~ -p ~~ -t ~~ -m ~~ --cafile ~~/ca.crt.pem --key
~~/client.key.pem --cert ~~/client.crt.pem-->它运行良好
mosquitto_pub -h ~~ -p ~~ -t ~~ -m ~~ --cafile ~~/ca.crt.pem-->它不起作用。我不知道为什么它不能工作。
但是,重要的是我无法连接到android。
我已经搜索过了,安卓使用.bks文件到tls/ssl。所以我试着用上面的文件做.bks文件。
我创建该文件的顺序是.p12 -> .jks -> .bks
和这些命令:
.p12 : > openssl pkcs12 -export -in client.crt.pem -inkey client.key.pem -out client.p12 -certfile ca.crt.pem.jks : > keytool -importkeystore -srckeystore client.p12 -srcstoretype pkcs12 -srcstorepass 123123 -destkeystore client.jks -deststoretype jks -deststorepass 123123 .bks : > keytool -importkeystore -srckeystore client.jks -srcstoretype JKS -srcstorepass 123123 -destkeystore client.bks -deststoretype BKS-v1 -deststorepass 123123 -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-162.jar 我的android代码是
....
mqttAndroidClient = new MqttAndroidClient(this, "ssl://" + ipAdd.getText().toString() + ":" + port.getText().toString(), ClientID);
try {
/**/
MqttConnectOptions options = new MqttConnectOptions();
InputStream input = this.getApplication().getAssets().open("server.bks");
options.setSocketFactory(new TLSSocketFactory(input, "123123"));
IMqttToken token = mqttAndroidClient.connect(options);
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
....public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory(InputStream keyStore, String password) throws KeyManagementException, NoSuchAlgorithmException, IOException, CertificateException, KeyStoreException {
KeyStore ts;
ts = KeyStore.getInstance("BKS");
ts.load(keyStore, password.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ts);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, tm, null);
internalSSLSocketFactory = context.getSocketFactory();
}
....broker上发生的消息是
1564452813: OpenSSL Error: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown
我不知道这是什么意思
请帮帮我,大师们。
发布于 2019-08-01 12:14:48
我找到了!
原因不是代码和密钥。
在我的包依赖部分:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1'都是原因。
mqttv3:1.2.1版本以下未出现错误。
我不知道两个版本有什么不同。
https://stackoverflow.com/questions/57263649
复制相似问题