Keygen scripts fixed
This commit is contained in:
		
							parent
							
								
									62f8dc198d
								
							
						
					
					
						commit
						788d71f1cc
					
				@ -82,6 +82,7 @@ mqtt:
 | 
			
		||||
#    key_password: server_key_password
 | 
			
		||||
#    key_store_type: JKS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# CoAP server parameters
 | 
			
		||||
coap:
 | 
			
		||||
  bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}"
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao;
 | 
			
		||||
 | 
			
		||||
import com.google.common.base.CharMatcher;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.bouncycastle.crypto.digests.SHA3Digest;
 | 
			
		||||
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
 | 
			
		||||
@ -28,7 +29,10 @@ public class EncryptionUtil {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,10 @@
 | 
			
		||||
            <groupId>org.eclipse.paho</groupId>
 | 
			
		||||
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.google.guava</groupId>
 | 
			
		||||
            <artifactId>guava</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <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)"
 | 
			
		||||
PASSWORD="password"
 | 
			
		||||
 | 
			
		||||
CLIENT_TRUSTSTORE="client_truststore.pem"
 | 
			
		||||
CLIENT_KEY_ALIAS="clientalias"
 | 
			
		||||
CLIENT_FILE_PREFIX="mqttclient"
 | 
			
		||||
ORGANIZATIONAL_UNIT=Thingsboard
 | 
			
		||||
ORGANIZATION=Thingsboard
 | 
			
		||||
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_FILE_PREFIX="mqttserver"
 | 
			
		||||
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 -*-
 | 
			
		||||
#
 | 
			
		||||
# Copyright © 2016-2017 The Thingsboard Authors
 | 
			
		||||
#
 | 
			
		||||
# 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,
 | 
			
		||||
#               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);
 | 
			
		||||
 | 
			
		||||
client.username_pw_set("B1_TEST_TOKEN")
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
# Copyright © 2016-2017 The Thingsboard Authors
 | 
			
		||||
#
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
usage() {
 | 
			
		||||
    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 "    -p | --props | --properties file  Properties file. default value is ./keygen.properties"
 | 
			
		||||
	echo "    -h | --help  | ?                  Show this message"
 | 
			
		||||
@ -44,17 +44,44 @@ done
 | 
			
		||||
 | 
			
		||||
. $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..."
 | 
			
		||||
 | 
			
		||||
keytool -genkeypair -v \
 | 
			
		||||
  -alias $CLIENT_KEY_ALIAS \
 | 
			
		||||
  -dname "CN=$DOMAIN_SUFFIX, OU=Thingsboard, O=Thingsboard, L=Piscataway, ST=NJ, C=US" \
 | 
			
		||||
  -keystore $CLIENT_FILE_PREFIX.jks \
 | 
			
		||||
  -keypass $PASSWORD \
 | 
			
		||||
  -storepass $PASSWORD \
 | 
			
		||||
  -keypass $CLIENT_KEY_PASSWORD \
 | 
			
		||||
  -storepass $CLIENT_KEYSTORE_PASSWORD \
 | 
			
		||||
  -keyalg RSA \
 | 
			
		||||
  -keysize 2048 \
 | 
			
		||||
  -validity 9999
 | 
			
		||||
 | 
			
		||||
echo "Converting keystore to pkcs12"
 | 
			
		||||
keytool -importkeystore  \
 | 
			
		||||
  -srckeystore $CLIENT_FILE_PREFIX.jks \
 | 
			
		||||
@ -62,28 +89,33 @@ keytool -importkeystore  \
 | 
			
		||||
  -srcalias $CLIENT_KEY_ALIAS \
 | 
			
		||||
  -srcstoretype jks \
 | 
			
		||||
  -deststoretype pkcs12 \
 | 
			
		||||
  -keypass $PASSWORD \
 | 
			
		||||
  -srcstorepass $PASSWORD \
 | 
			
		||||
  -deststorepass $PASSWORD \
 | 
			
		||||
  -srckeypass $PASSWORD \
 | 
			
		||||
  -destkeypass $PASSWORD
 | 
			
		||||
  -srcstorepass $CLIENT_KEYSTORE_PASSWORD \
 | 
			
		||||
  -deststorepass $CLIENT_KEY_PASSWORD \
 | 
			
		||||
  -srckeypass $CLIENT_KEY_PASSWORD \
 | 
			
		||||
  -destkeypass $CLIENT_KEY_PASSWORD
 | 
			
		||||
 | 
			
		||||
echo "Converting pkcs12 to pem"
 | 
			
		||||
openssl pkcs12 -in $CLIENT_FILE_PREFIX.p12 \
 | 
			
		||||
  -out $CLIENT_FILE_PREFIX.pem \
 | 
			
		||||
  -passin pass:$PASSWORD \
 | 
			
		||||
  -passout pass:$PASSWORD \
 | 
			
		||||
  -passin pass:$CLIENT_KEY_PASSWORD \
 | 
			
		||||
  -passout pass:$CLIENT_KEY_PASSWORD \
 | 
			
		||||
 | 
			
		||||
echo "Importing server public key..."
 | 
			
		||||
keytool -export \
 | 
			
		||||
  -alias $SERVER_KEY_ALIAS \
 | 
			
		||||
  -keystore $SERVER_KEYSTORE_DIR/$SERVER_FILE_PREFIX.jks \
 | 
			
		||||
  -file $CLIENT_TRUSTSTORE -rfc \
 | 
			
		||||
  -storepass $PASSWORD
 | 
			
		||||
echo "Importing server public key to $CLIENT_FILE_PREFIX.jks"
 | 
			
		||||
keytool --importcert \
 | 
			
		||||
   -file $SERVER_FILE_PREFIX.cer \
 | 
			
		||||
   -keystore $CLIENT_FILE_PREFIX.jks \
 | 
			
		||||
   -alias $SERVER_KEY_ALIAS \
 | 
			
		||||
   -keypass $SERVER_KEY_PASSWORD \
 | 
			
		||||
   -storepass $CLIENT_KEYSTORE_PASSWORD \
 | 
			
		||||
   -noprompt
 | 
			
		||||
 | 
			
		||||
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) )) \
 | 
			
		||||
  $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."
 | 
			
		||||
							
								
								
									
										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.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)
 | 
			
		||||
 | 
			
		||||
# Blocking call that processes network traffic, dispatches callbacks and
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@ client.on_connect = on_connect
 | 
			
		||||
client.on_message = on_message
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
client.tls_insecure_set(False)
 | 
			
		||||
 | 
			
		||||
@ -64,11 +64,9 @@
 | 
			
		||||
            <groupId>ch.qos.logback</groupId>
 | 
			
		||||
            <artifactId>logback-classic</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.google.guava</groupId>
 | 
			
		||||
            <artifactId>guava</artifactId>
 | 
			
		||||
            <version>18.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
 | 
			
		||||
@ -49,6 +49,8 @@ public class MqttSslHandlerProvider {
 | 
			
		||||
    private String keyStoreFile;
 | 
			
		||||
    @Value("${mqtt.ssl.key_store_password}")
 | 
			
		||||
    private String keyStorePassword;
 | 
			
		||||
    @Value("${mqtt.ssl.key_password}")
 | 
			
		||||
    private String keyPassword;
 | 
			
		||||
    @Value("${mqtt.ssl.key_store_type}")
 | 
			
		||||
    private String keyStoreType;
 | 
			
		||||
    
 | 
			
		||||
@ -72,7 +74,7 @@ public class MqttSslHandlerProvider {
 | 
			
		||||
 | 
			
		||||
            ks.load(new FileInputStream(ksFile), keyStorePassword.toCharArray());
 | 
			
		||||
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
 | 
			
		||||
            kmf.init(ks, keyStorePassword.toCharArray());
 | 
			
		||||
            kmf.init(ks, keyPassword.toCharArray());
 | 
			
		||||
 | 
			
		||||
            KeyManager[] km = kmf.getKeyManagers();
 | 
			
		||||
            TrustManager x509wrapped = getX509TrustManager(tmFactory);
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.transport.mqtt.util;
 | 
			
		||||
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.util.Base64Utils;
 | 
			
		||||
import org.thingsboard.server.dao.EncryptionUtil;
 | 
			
		||||
import sun.misc.BASE64Encoder;
 | 
			
		||||
 | 
			
		||||
@ -35,17 +36,13 @@ public class SslUtil {
 | 
			
		||||
 | 
			
		||||
    public static String getX509CertificateString(X509Certificate cert)
 | 
			
		||||
            throws CertificateEncodingException, IOException {
 | 
			
		||||
        ByteArrayOutputStream out = new ByteArrayOutputStream();
 | 
			
		||||
        BASE64Encoder encoder = new BASE64Encoder();
 | 
			
		||||
        encoder.encodeBuffer(cert.getEncoded(), out);
 | 
			
		||||
        return EncryptionUtil.trimNewLines(new String(out.toByteArray(), "UTF-8"));
 | 
			
		||||
        Base64Utils.encodeToString(cert.getEncoded());
 | 
			
		||||
        return EncryptionUtil.trimNewLines(Base64Utils.encodeToString(cert.getEncoded()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getX509CertificateString(javax.security.cert.X509Certificate cert)
 | 
			
		||||
            throws javax.security.cert.CertificateEncodingException, IOException {
 | 
			
		||||
        ByteArrayOutputStream out = new ByteArrayOutputStream();
 | 
			
		||||
        BASE64Encoder encoder = new BASE64Encoder();
 | 
			
		||||
        encoder.encodeBuffer(cert.getEncoded(), out);
 | 
			
		||||
        return EncryptionUtil.trimNewLines(new String(out.toByteArray(), "UTF-8"));
 | 
			
		||||
        Base64Utils.encodeToString(cert.getEncoded());
 | 
			
		||||
        return EncryptionUtil.trimNewLines(Base64Utils.encodeToString(cert.getEncoded()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user