Keygen scripts fixed
This commit is contained in:
parent
62f8dc198d
commit
788d71f1cc
@ -82,6 +82,7 @@ mqtt:
|
|||||||
# key_password: server_key_password
|
# key_password: server_key_password
|
||||||
# key_store_type: JKS
|
# key_store_type: JKS
|
||||||
|
|
||||||
|
|
||||||
# CoAP server parameters
|
# CoAP server parameters
|
||||||
coap:
|
coap:
|
||||||
bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}"
|
bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}"
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao;
|
package org.thingsboard.server.dao;
|
||||||
|
|
||||||
|
import com.google.common.base.CharMatcher;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.bouncycastle.crypto.digests.SHA3Digest;
|
import org.bouncycastle.crypto.digests.SHA3Digest;
|
||||||
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
|
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
|
||||||
@ -28,7 +29,10 @@ public class EncryptionUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String trimNewLines(String input) {
|
public static String trimNewLines(String input) {
|
||||||
return input.replaceAll("\n","").replaceAll("\r","");
|
return input.replaceAll("-----BEGIN CERTIFICATE-----", "")
|
||||||
|
.replaceAll("-----END CERTIFICATE-----", "")
|
||||||
|
.replaceAll("\n","")
|
||||||
|
.replaceAll("\r","");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSha3Hash(String data) {
|
public static String getSha3Hash(String data) {
|
||||||
|
|||||||
@ -48,6 +48,10 @@
|
|||||||
<groupId>org.eclipse.paho</groupId>
|
<groupId>org.eclipse.paho</groupId>
|
||||||
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
|
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -0,0 +1,89 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2017 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.client.tools;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Valerii Sosliuk
|
||||||
|
* This class is intended for manual MQTT SSL Testing
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.google.common.io.Resources;
|
||||||
|
import org.eclipse.paho.client.mqttv3.*;
|
||||||
|
|
||||||
|
import javax.net.ssl.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
|
||||||
|
public class MqttSslClient {
|
||||||
|
|
||||||
|
|
||||||
|
private static final String MQTT_URL = "ssl://localhost:1883";
|
||||||
|
|
||||||
|
private static final String clientId = "MQTT_SSL_JAVA_CLIENT";
|
||||||
|
private static final String accessToken = "C1_TEST_TOKEN";
|
||||||
|
private static final String keyStoreFile = "mqttclient.jks";
|
||||||
|
private static final String JKS="JKS";
|
||||||
|
private static final String TLS="TLS";
|
||||||
|
private static final String CLIENT_KEYSTORE_PASSWORD = "client_ks_password";
|
||||||
|
private static final String CLIENT_KEY_PASSWORD = "client_key_password";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
URL ksUrl = Resources.getResource(keyStoreFile);
|
||||||
|
File ksFile = new File(ksUrl.toURI());
|
||||||
|
URL tsUrl = Resources.getResource(keyStoreFile);
|
||||||
|
File tsFile = new File(tsUrl.toURI());
|
||||||
|
|
||||||
|
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||||
|
|
||||||
|
KeyStore trustStore = KeyStore.getInstance(JKS);
|
||||||
|
trustStore.load(new FileInputStream(tsFile), CLIENT_KEYSTORE_PASSWORD.toCharArray());
|
||||||
|
tmf.init(trustStore);
|
||||||
|
KeyStore ks = KeyStore.getInstance(JKS);
|
||||||
|
|
||||||
|
ks.load(new FileInputStream(ksFile), CLIENT_KEYSTORE_PASSWORD.toCharArray());
|
||||||
|
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
||||||
|
kmf.init(ks, CLIENT_KEY_PASSWORD.toCharArray());
|
||||||
|
|
||||||
|
KeyManager[] km = kmf.getKeyManagers();
|
||||||
|
TrustManager[] tm = tmf.getTrustManagers();
|
||||||
|
SSLContext sslContext = SSLContext.getInstance(TLS);
|
||||||
|
sslContext.init(km, tm, null);
|
||||||
|
|
||||||
|
MqttConnectOptions options = new MqttConnectOptions();
|
||||||
|
options.setSocketFactory(sslContext.getSocketFactory());
|
||||||
|
MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId);
|
||||||
|
client.connect(options);
|
||||||
|
Thread.sleep(3000);
|
||||||
|
MqttMessage message = new MqttMessage();
|
||||||
|
message.setPayload("{\"key1\":\"zaloopa\", \"key2\":true, \"key3\": 3.0, \"key4\": 4}".getBytes());
|
||||||
|
client.publish("v1/devices/me/telemetry", message);
|
||||||
|
client.disconnect();
|
||||||
|
System.out.println("Disconnected");
|
||||||
|
System.exit(0);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -15,12 +15,24 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
DOMAIN_SUFFIX="$(hostname)"
|
DOMAIN_SUFFIX="$(hostname)"
|
||||||
PASSWORD="password"
|
|
||||||
|
|
||||||
CLIENT_TRUSTSTORE="client_truststore.pem"
|
ORGANIZATIONAL_UNIT=Thingsboard
|
||||||
CLIENT_KEY_ALIAS="clientalias"
|
ORGANIZATION=Thingsboard
|
||||||
CLIENT_FILE_PREFIX="mqttclient"
|
CITY=Piscataway
|
||||||
|
STATE_OR_PROVINCE=NJ
|
||||||
|
TWO_LETTER_COUNTRY_CODE=US
|
||||||
|
|
||||||
|
SERVER_KEYSTORE_PASSWORD=server_ks_password
|
||||||
|
SERVER_KEY_PASSWORD=server_key_password
|
||||||
|
|
||||||
SERVER_KEY_ALIAS="serveralias"
|
SERVER_KEY_ALIAS="serveralias"
|
||||||
SERVER_FILE_PREFIX="mqttserver"
|
SERVER_FILE_PREFIX="mqttserver"
|
||||||
SERVER_KEYSTORE_DIR="../../../../application/src/main/resources/keystore/"
|
SERVER_KEYSTORE_DIR="../../../../application/src/main/resources/keystore/"
|
||||||
|
|
||||||
|
CLIENT_KEYSTORE_PASSWORD=client_ks_password
|
||||||
|
CLIENT_KEY_PASSWORD=client_key_password
|
||||||
|
|
||||||
|
CLIENT_TRUSTSTORE="client_truststore"
|
||||||
|
CLIENT_KEY_ALIAS="clientalias"
|
||||||
|
CLIENT_FILE_PREFIX="mqttclient"
|
||||||
|
|
||||||
|
|||||||
@ -1,118 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Copyright © 2016-2017 The Thingsboard Authors
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo "This script generates thingsboard server's ssl certificate"
|
|
||||||
echo "and optionally copies it to the server's resource directory."
|
|
||||||
echo "usage: ./keygen.sh [-c flag] [-d directory]"
|
|
||||||
echo " -c | --copy flag Set if copy keystore to server directory needed. Default value is true"
|
|
||||||
echo " -d | --dir directory Server keystore directory, where the generated keystore file will be copied."
|
|
||||||
echo " Default value is SERVER_KEYSTORE_DIR property from properties file"
|
|
||||||
echo " -p | --props | --properties file Properties file. default value is ./keygen.properties"
|
|
||||||
echo " -h | --help | ? Show this message"
|
|
||||||
}
|
|
||||||
|
|
||||||
COPY=true;
|
|
||||||
COPY_DIR=
|
|
||||||
PROPERTIES_FILE=keygen.properties
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
case "$1" in
|
|
||||||
-c | --copy) COPY=$2 ;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-d | --dir | --directory) COPY_DIR=$2 ;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-p | --props | --properties) PROPERTIES_FILE=$2 ;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-h | --help | ?) usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
-- ) shift;
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
* ) break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ "$COPY" != true ]] && [[ "$COPY" != false ]]; then
|
|
||||||
usage
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "copy: $COPY; copy_dir: $COPY_DIR; PROPERTIES_FILE=$PROPERTIES_FILE";
|
|
||||||
|
|
||||||
. $PROPERTIES_FILE
|
|
||||||
|
|
||||||
echo "Generating SSL Key Pair..."
|
|
||||||
|
|
||||||
keytool -genkeypair -v \
|
|
||||||
-alias $SERVER_KEY_ALIAS \
|
|
||||||
-dname "CN=$DOMAIN_SUFFIX, OU=Thingsboard, O=Thingsboard, L=Piscataway, ST=NJ, C=US" \
|
|
||||||
-keystore $SERVER_FILE_PREFIX.jks \
|
|
||||||
-keypass $PASSWORD \
|
|
||||||
-storepass $PASSWORD \
|
|
||||||
-keyalg RSA \
|
|
||||||
-keysize 2048 \
|
|
||||||
-validity 9999
|
|
||||||
|
|
||||||
status=$?
|
|
||||||
if [[ $status != 0 ]]; then
|
|
||||||
exit $status;
|
|
||||||
fi
|
|
||||||
|
|
||||||
keytool -export \
|
|
||||||
-alias $SERVER_KEY_ALIAS \
|
|
||||||
-keystore $SERVER_FILE_PREFIX.jks \
|
|
||||||
-file $CLIENT_TRUSTSTORE -rfc \
|
|
||||||
-storepass $PASSWORD
|
|
||||||
|
|
||||||
status=$?
|
|
||||||
if [[ $status != 0 ]]; then
|
|
||||||
exit $status;
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $COPY = true ]]; then
|
|
||||||
if [[ -z "$COPY_DIR" ]]; then
|
|
||||||
read -p "Do you want to copy $SERVER_FILE_PREFIX.jks to server directory? " yn
|
|
||||||
case $yn in
|
|
||||||
[Yy]) echo "Please, specify destination dir: "
|
|
||||||
read -p "(Default: $SERVER_KEYSTORE_DIR): " dir
|
|
||||||
if [[ ! -z $dir ]]; then
|
|
||||||
DESTINATION=$dir;
|
|
||||||
else
|
|
||||||
DESTINATION=$SERVER_KEYSTORE_DIR
|
|
||||||
fi;
|
|
||||||
break;;
|
|
||||||
* ) ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
DESTINATION=$COPY_DIR
|
|
||||||
fi
|
|
||||||
mkdir -p $DESTINATION
|
|
||||||
cp $SERVER_FILE_PREFIX.jks $DESTINATION
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Failed to copy keystore file."
|
|
||||||
else
|
|
||||||
echo "File copied successfully."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo "Done."
|
|
||||||
@ -1,5 +1,4 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
|
||||||
# Copyright © 2016-2017 The Thingsboard Authors
|
# Copyright © 2016-2017 The Thingsboard Authors
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -44,7 +43,7 @@ client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}
|
|||||||
|
|
||||||
#client.tls_set(ca_certs="client_truststore.pem", certfile="mqttclient.nopass.pem", keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
#client.tls_set(ca_certs="client_truststore.pem", certfile="mqttclient.nopass.pem", keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
||||||
# tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
# tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
||||||
client.tls_set(ca_certs="client_truststore.pem", certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
client.tls_set(ca_certs="mqttserver.pub.pem", certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
||||||
tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
||||||
|
|
||||||
client.username_pw_set("B1_TEST_TOKEN")
|
client.username_pw_set("B1_TEST_TOKEN")
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright © 2016-2017 The Thingsboard Authors
|
# Copyright © 2016-2017 The Thingsboard Authors
|
||||||
#
|
#
|
||||||
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "This script generates client public/private rey pair, extracts them to a no-password RSA pem file,"
|
echo "This script generates client public/private rey pair, extracts them to a no-password RSA pem file,"
|
||||||
echo "and also imports server public key to client trust store"
|
echo "and imports server public key to client keystore"
|
||||||
echo "usage: ./securemqttclient.keygen.sh [-p file]"
|
echo "usage: ./securemqttclient.keygen.sh [-p file]"
|
||||||
echo " -p | --props | --properties file Properties file. default value is ./keygen.properties"
|
echo " -p | --props | --properties file Properties file. default value is ./keygen.properties"
|
||||||
echo " -h | --help | ? Show this message"
|
echo " -h | --help | ? Show this message"
|
||||||
@ -44,17 +44,44 @@ done
|
|||||||
|
|
||||||
. $PROPERTIES_FILE
|
. $PROPERTIES_FILE
|
||||||
|
|
||||||
|
if [ -f $CLIENT_FILE_PREFIX.jks ] || [ -f $CLIENT_FILE_PREFIX.pub.pem ] || [ -f $CLIENT_FILE_PREFIX.nopass.pem ] || [ -f $CLIENT_FILE_PREFIX.pem ] || [ -f $CLIENT_FILE_PREFIX.p12 ];
|
||||||
|
then
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
read -p "Output files from previous server.keygen.sh script run found. Overwrite?[yes]" response
|
||||||
|
case $response in
|
||||||
|
[nN]|[nN][oO])
|
||||||
|
echo "Skipping"
|
||||||
|
echo "Done"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
[yY]|[yY][eE]|[yY][eE]|[sS]|[yY]|"")
|
||||||
|
echo "Cleaning up files"
|
||||||
|
rm -rf $CLIENT_FILE_PREFIX.jks
|
||||||
|
rm -rf $CLIENT_FILE_PREFIX.pub.pem
|
||||||
|
rm -rf $CLIENT_FILE_PREFIX.nopass.pem
|
||||||
|
rm -rf $CLIENT_FILE_PREFIX.pem
|
||||||
|
rm -rf $CLIENT_FILE_PREFIX.p12
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
*) echo "Please reply 'yes' or 'no'"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Generating SSL Key Pair..."
|
echo "Generating SSL Key Pair..."
|
||||||
|
|
||||||
keytool -genkeypair -v \
|
keytool -genkeypair -v \
|
||||||
-alias $CLIENT_KEY_ALIAS \
|
-alias $CLIENT_KEY_ALIAS \
|
||||||
-dname "CN=$DOMAIN_SUFFIX, OU=Thingsboard, O=Thingsboard, L=Piscataway, ST=NJ, C=US" \
|
-dname "CN=$DOMAIN_SUFFIX, OU=Thingsboard, O=Thingsboard, L=Piscataway, ST=NJ, C=US" \
|
||||||
-keystore $CLIENT_FILE_PREFIX.jks \
|
-keystore $CLIENT_FILE_PREFIX.jks \
|
||||||
-keypass $PASSWORD \
|
-keypass $CLIENT_KEY_PASSWORD \
|
||||||
-storepass $PASSWORD \
|
-storepass $CLIENT_KEYSTORE_PASSWORD \
|
||||||
-keyalg RSA \
|
-keyalg RSA \
|
||||||
-keysize 2048 \
|
-keysize 2048 \
|
||||||
-validity 9999
|
-validity 9999
|
||||||
|
|
||||||
echo "Converting keystore to pkcs12"
|
echo "Converting keystore to pkcs12"
|
||||||
keytool -importkeystore \
|
keytool -importkeystore \
|
||||||
-srckeystore $CLIENT_FILE_PREFIX.jks \
|
-srckeystore $CLIENT_FILE_PREFIX.jks \
|
||||||
@ -62,28 +89,33 @@ keytool -importkeystore \
|
|||||||
-srcalias $CLIENT_KEY_ALIAS \
|
-srcalias $CLIENT_KEY_ALIAS \
|
||||||
-srcstoretype jks \
|
-srcstoretype jks \
|
||||||
-deststoretype pkcs12 \
|
-deststoretype pkcs12 \
|
||||||
-keypass $PASSWORD \
|
-srcstorepass $CLIENT_KEYSTORE_PASSWORD \
|
||||||
-srcstorepass $PASSWORD \
|
-deststorepass $CLIENT_KEY_PASSWORD \
|
||||||
-deststorepass $PASSWORD \
|
-srckeypass $CLIENT_KEY_PASSWORD \
|
||||||
-srckeypass $PASSWORD \
|
-destkeypass $CLIENT_KEY_PASSWORD
|
||||||
-destkeypass $PASSWORD
|
|
||||||
|
|
||||||
echo "Converting pkcs12 to pem"
|
echo "Converting pkcs12 to pem"
|
||||||
openssl pkcs12 -in $CLIENT_FILE_PREFIX.p12 \
|
openssl pkcs12 -in $CLIENT_FILE_PREFIX.p12 \
|
||||||
-out $CLIENT_FILE_PREFIX.pem \
|
-out $CLIENT_FILE_PREFIX.pem \
|
||||||
-passin pass:$PASSWORD \
|
-passin pass:$CLIENT_KEY_PASSWORD \
|
||||||
-passout pass:$PASSWORD \
|
-passout pass:$CLIENT_KEY_PASSWORD \
|
||||||
|
|
||||||
echo "Importing server public key..."
|
echo "Importing server public key to $CLIENT_FILE_PREFIX.jks"
|
||||||
keytool -export \
|
keytool --importcert \
|
||||||
|
-file $SERVER_FILE_PREFIX.cer \
|
||||||
|
-keystore $CLIENT_FILE_PREFIX.jks \
|
||||||
-alias $SERVER_KEY_ALIAS \
|
-alias $SERVER_KEY_ALIAS \
|
||||||
-keystore $SERVER_KEYSTORE_DIR/$SERVER_FILE_PREFIX.jks \
|
-keypass $SERVER_KEY_PASSWORD \
|
||||||
-file $CLIENT_TRUSTSTORE -rfc \
|
-storepass $CLIENT_KEYSTORE_PASSWORD \
|
||||||
-storepass $PASSWORD
|
-noprompt
|
||||||
|
|
||||||
echo "Exporting no-password pem certificate"
|
echo "Exporting no-password pem certificate"
|
||||||
openssl rsa -in $CLIENT_FILE_PREFIX.pem -out $CLIENT_FILE_PREFIX.nopass.pem -passin pass:$PASSWORD
|
openssl rsa -in $CLIENT_FILE_PREFIX.pem -out $CLIENT_FILE_PREFIX.nopass.pem -passin pass:$CLIENT_KEY_PASSWORD
|
||||||
tail -n +$(($(grep -m1 -n -e '-----BEGIN CERTIFICATE' $CLIENT_FILE_PREFIX.pem | cut -d: -f1) )) \
|
tail -n +$(($(grep -m1 -n -e '-----BEGIN CERTIFICATE' $CLIENT_FILE_PREFIX.pem | cut -d: -f1) )) \
|
||||||
$CLIENT_FILE_PREFIX.pem >> $CLIENT_FILE_PREFIX.nopass.pem
|
$CLIENT_FILE_PREFIX.pem >> $CLIENT_FILE_PREFIX.nopass.pem
|
||||||
|
|
||||||
|
echo "Exporting client public key"
|
||||||
|
tail -n +$(($(grep -m1 -n -e '-----BEGIN CERTIFICATE' $CLIENT_FILE_PREFIX.pem | cut -d: -f1) )) \
|
||||||
|
$CLIENT_FILE_PREFIX.pem >> $CLIENT_FILE_PREFIX.pub.pem
|
||||||
|
|
||||||
echo "Done."
|
echo "Done."
|
||||||
158
tools/src/main/shell/server.keygen.sh
Executable file
158
tools/src/main/shell/server.keygen.sh
Executable file
@ -0,0 +1,158 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright © 2016-2017 The Thingsboard Authors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "This script generates thingsboard server's ssl certificate"
|
||||||
|
echo "and optionally copies it to the server's resource directory."
|
||||||
|
echo "usage: ./server.keygen.sh [-c flag] [-d directory] [-p file]"
|
||||||
|
echo " -c | --copy flag Set if copy keystore to server directory needed. Default value is true"
|
||||||
|
echo " -d | --dir directory Server keystore directory, where the generated keystore file will be copied."
|
||||||
|
echo " Default value is SERVER_KEYSTORE_DIR property from properties file"
|
||||||
|
echo " -p | --props | --properties file Properties file. default value is ./keygen.properties"
|
||||||
|
echo " -h | --help | ? Show this message"
|
||||||
|
}
|
||||||
|
|
||||||
|
COPY=true;
|
||||||
|
COPY_DIR=
|
||||||
|
PROPERTIES_FILE=keygen.properties
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
case "$1" in
|
||||||
|
-c | --copy) COPY=$2 ;
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-d | --dir | --directory ) COPY_DIR=$2 ;
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-p | --props | --properties ) PROPERTIES_FILE=$2 ;
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-- ) shift;
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
"" ) break
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h | --help | ? | *) usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$COPY" != true ]] && [[ "$COPY" != false ]]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
. $PROPERTIES_FILE
|
||||||
|
|
||||||
|
if [ -f $SERVER_FILE_PREFIX.jks ] || [ -f $SERVER_FILE_PREFIX.cer ] || [ -f $SERVER_FILE_PREFIX.pub.pem ] || [ -f $SERVER_FILE_PREFIX.pub.der ];
|
||||||
|
then
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
read -p "Output files from previous server.keygen.sh script run found. Overwrite?[yes]" response
|
||||||
|
case $response in
|
||||||
|
[nN]|[nN][oO])
|
||||||
|
echo "Skipping"
|
||||||
|
echo "Done"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
[yY]|[yY][eE]|[yY][eE]|[sS]|[yY]|"")
|
||||||
|
echo "Cleaning up files"
|
||||||
|
rm -rf $SERVER_FILE_PREFIX.jks
|
||||||
|
rm -rf $SERVER_FILE_PREFIX.pub.pem
|
||||||
|
rm -rf $SERVER_FILE_PREFIX.cer
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
*) echo "Please reply 'yes' or 'no'"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Generating SSL Key Pair..."
|
||||||
|
|
||||||
|
keytool -genkeypair -v \
|
||||||
|
-alias $SERVER_KEY_ALIAS \
|
||||||
|
-dname "CN=$DOMAIN_SUFFIX, OU=$ORGANIZATIONAL_UNIT, O=$ORGANIZATION, L=$CITY, ST=$STATE_OR_PROVINCE, C=$TWO_LETTER_COUNTRY_CODE" \
|
||||||
|
-keystore $SERVER_FILE_PREFIX.jks \
|
||||||
|
-keypass $SERVER_KEY_PASSWORD \
|
||||||
|
-storepass $SERVER_KEYSTORE_PASSWORD \
|
||||||
|
-keyalg RSA \
|
||||||
|
-keysize 2048 \
|
||||||
|
-validity 9999
|
||||||
|
|
||||||
|
status=$?
|
||||||
|
if [[ $status != 0 ]]; then
|
||||||
|
exit $status;
|
||||||
|
fi
|
||||||
|
|
||||||
|
keytool -export \
|
||||||
|
-alias $SERVER_KEY_ALIAS \
|
||||||
|
-keystore $SERVER_FILE_PREFIX.jks \
|
||||||
|
-file $SERVER_FILE_PREFIX.pub.pem -rfc \
|
||||||
|
-storepass $SERVER_KEYSTORE_PASSWORD
|
||||||
|
|
||||||
|
keytool -export \
|
||||||
|
-alias $SERVER_KEY_ALIAS \
|
||||||
|
-file $SERVER_FILE_PREFIX.cer \
|
||||||
|
-keystore $SERVER_FILE_PREFIX.jks \
|
||||||
|
-storepass $SERVER_KEYSTORE_PASSWORD \
|
||||||
|
-keypass $SERVER_KEY_PASSWORD
|
||||||
|
|
||||||
|
status=$?
|
||||||
|
if [[ $status != 0 ]]; then
|
||||||
|
exit $status;
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [[ $COPY = true ]]; then
|
||||||
|
if [[ -z "$COPY_DIR" ]]; then
|
||||||
|
read -p "Do you want to copy $SERVER_FILE_PREFIX.jks to server directory?[yes]" yn
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
case $yn in
|
||||||
|
[nN]|[nN][oO])
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
[yY]|[yY][eE]|[yY][eE]|[sS]|[yY]|"")
|
||||||
|
read -p "(Default: $SERVER_KEYSTORE_DIR): " dir
|
||||||
|
if [[ ! -z $dir ]]; then
|
||||||
|
DESTINATION=$dir;
|
||||||
|
else
|
||||||
|
DESTINATION=$SERVER_KEYSTORE_DIR
|
||||||
|
fi;
|
||||||
|
break;;
|
||||||
|
*) echo "Please reply 'yes' or 'no'"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
DESTINATION=$COPY_DIR
|
||||||
|
fi
|
||||||
|
echo "*** DEST: $DESTINATION"
|
||||||
|
if [[ -n $DESTINATION ]]; then
|
||||||
|
mkdir -p $DESTINATION
|
||||||
|
cp $SERVER_FILE_PREFIX.jks $DESTINATION
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Failed to copy keystore file."
|
||||||
|
else
|
||||||
|
echo "File copied successfully."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "Done."
|
||||||
@ -41,7 +41,7 @@ client.on_connect = on_connect
|
|||||||
client.on_message = on_message
|
client.on_message = on_message
|
||||||
client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}", 1)
|
client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}", 1)
|
||||||
|
|
||||||
client.username_pw_set("TEST_TOKEN")
|
client.username_pw_set("B1_TEST_TOKEN")
|
||||||
client.connect('127.0.0.1', 1883, 1)
|
client.connect('127.0.0.1', 1883, 1)
|
||||||
|
|
||||||
# Blocking call that processes network traffic, dispatches callbacks and
|
# Blocking call that processes network traffic, dispatches callbacks and
|
||||||
|
|||||||
@ -42,7 +42,7 @@ client.on_connect = on_connect
|
|||||||
client.on_message = on_message
|
client.on_message = on_message
|
||||||
client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}", 1)
|
client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}", 1)
|
||||||
|
|
||||||
client.tls_set(ca_certs="client_truststore.pem", certfile="mqttclient.nopass.pem", keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
client.tls_set(ca_certs="mqttserver.pub.pem", certfile="mqttclient.nopass.pem", keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
|
||||||
tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
tls_version=ssl.PROTOCOL_TLSv1, ciphers=None);
|
||||||
|
|
||||||
client.tls_insecure_set(False)
|
client.tls_insecure_set(False)
|
||||||
|
|||||||
@ -64,11 +64,9 @@
|
|||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>18.0</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
|||||||
@ -49,6 +49,8 @@ public class MqttSslHandlerProvider {
|
|||||||
private String keyStoreFile;
|
private String keyStoreFile;
|
||||||
@Value("${mqtt.ssl.key_store_password}")
|
@Value("${mqtt.ssl.key_store_password}")
|
||||||
private String keyStorePassword;
|
private String keyStorePassword;
|
||||||
|
@Value("${mqtt.ssl.key_password}")
|
||||||
|
private String keyPassword;
|
||||||
@Value("${mqtt.ssl.key_store_type}")
|
@Value("${mqtt.ssl.key_store_type}")
|
||||||
private String keyStoreType;
|
private String keyStoreType;
|
||||||
|
|
||||||
@ -72,7 +74,7 @@ public class MqttSslHandlerProvider {
|
|||||||
|
|
||||||
ks.load(new FileInputStream(ksFile), keyStorePassword.toCharArray());
|
ks.load(new FileInputStream(ksFile), keyStorePassword.toCharArray());
|
||||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
||||||
kmf.init(ks, keyStorePassword.toCharArray());
|
kmf.init(ks, keyPassword.toCharArray());
|
||||||
|
|
||||||
KeyManager[] km = kmf.getKeyManagers();
|
KeyManager[] km = kmf.getKeyManagers();
|
||||||
TrustManager x509wrapped = getX509TrustManager(tmFactory);
|
TrustManager x509wrapped = getX509TrustManager(tmFactory);
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.transport.mqtt.util;
|
package org.thingsboard.server.transport.mqtt.util;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.util.Base64Utils;
|
||||||
import org.thingsboard.server.dao.EncryptionUtil;
|
import org.thingsboard.server.dao.EncryptionUtil;
|
||||||
import sun.misc.BASE64Encoder;
|
import sun.misc.BASE64Encoder;
|
||||||
|
|
||||||
@ -35,17 +36,13 @@ public class SslUtil {
|
|||||||
|
|
||||||
public static String getX509CertificateString(X509Certificate cert)
|
public static String getX509CertificateString(X509Certificate cert)
|
||||||
throws CertificateEncodingException, IOException {
|
throws CertificateEncodingException, IOException {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
Base64Utils.encodeToString(cert.getEncoded());
|
||||||
BASE64Encoder encoder = new BASE64Encoder();
|
return EncryptionUtil.trimNewLines(Base64Utils.encodeToString(cert.getEncoded()));
|
||||||
encoder.encodeBuffer(cert.getEncoded(), out);
|
|
||||||
return EncryptionUtil.trimNewLines(new String(out.toByteArray(), "UTF-8"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getX509CertificateString(javax.security.cert.X509Certificate cert)
|
public static String getX509CertificateString(javax.security.cert.X509Certificate cert)
|
||||||
throws javax.security.cert.CertificateEncodingException, IOException {
|
throws javax.security.cert.CertificateEncodingException, IOException {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
Base64Utils.encodeToString(cert.getEncoded());
|
||||||
BASE64Encoder encoder = new BASE64Encoder();
|
return EncryptionUtil.trimNewLines(Base64Utils.encodeToString(cert.getEncoded()));
|
||||||
encoder.encodeBuffer(cert.getEncoded(), out);
|
|
||||||
return EncryptionUtil.trimNewLines(new String(out.toByteArray(), "UTF-8"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user