14 changed files with 335 additions and 159 deletions
@ -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\":\"value1\", \"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(); |
|||
} |
|||
} |
|||
} |
|||
@ -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." |
|||
@ -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 Specifies if the keystore should be copied to the server directory. Defaults to true" |
|||
echo " -d | --dir directory Server keystore directory, where the generated keystore file will be copied. If specified, overrides the value from the properties file" |
|||
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." |
|||
Loading…
Reference in new issue