zoukankan      html  css  js  c++  java
  • mosquitto --- 单向认证

    1.生成证书
    要单向配置SSL 需要 做三项前置工作

    1. 生成CA证书

    2.生成server 端证书,server 端key 

    github 的一个开源项目已经做到这点 ,详情可见 https://github.com/iandl/mqttitude/blob/master/tools/TLS/generate-CA.sh

    为方便阅读,整个shell 代码先贴出来

    #!/bin/sh
    #(@)generate-CA.sh - Create CA key-pair and server key-pair signed by CA
     
    # Copyright (c) 2013 Jan-Piet Mens <jpmens()gmail.com>
    # All rights reserved.
    # 
    # Redistribution and use in source and binary forms, with or without
    # modification, are permitted provided that the following conditions are met:
    # 
    # 1. Redistributions of source code must retain the above copyright notice,
    #    this list of conditions and the following disclaimer.
    # 2. Redistributions in binary form must reproduce the above copyright
    #    notice, this list of conditions and the following disclaimer in the
    #    documentation and/or other materials provided with the distribution.
    # 3. Neither the name of mosquitto nor the names of its
    #    contributors may be used to endorse or promote products derived from
    #    this software without specific prior written permission.
    # 
    # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    # POSSIBILITY OF SUCH DAMAGE.
     
    set -e
     
    DIR=${TARGET:='.'}
    # A space-separated list of alternate hostnames (subjAltName)
    # may be empty ""
    ALTHOSTNAMES="broker.example.com foo.example.de"
    CA_ORG='/O=MQTTitude.org/emailAddress=nobody@example.net'
    CA_DN="/CN=An MQTT broker${CA_ORG}"
    CACERT=${DIR}/ca
    SERVER=${DIR}/server
    SERVER_DN="/CN=$(hostname -f)$CA_ORG"
    keybits=2048
    openssl=$(which openssl)
     
    function maxdays() {
    	nowyear=$(date +%Y)
    	years=$(expr 2032 - $nowyear)
    	days=$(expr $years '*' 365)
     
    	echo $days
    }
     
    function getipaddresses() {
    	/sbin/ifconfig |
    		sed -En '/inet6? /p' |
    		sed -Ee 's/inet6? (addr:)?//' |
    		awk '{print $1;}' |
    		sed -e 's/[%/].*//' |
    		egrep -v '(::1|127.0.0.1)'	# omit loopback to add it later
    }
     
     
    function addresslist() {
     
    	ALIST=""
    	for a in $(getipaddresses); do
    		ALIST="${ALIST}IP:$a,"
    	done
    	ALIST="${ALIST}IP:127.0.0.1,IP:::1,"
     
    	for h in $(echo ${ALTHOSTNAMES}); do
    		ALIST="${ALIST}DNS:$h,"
    	done
    	ALIST="${ALIST}DNS:localhost"
    	echo $ALIST
     
    }
     
    days=$(maxdays)
     
    if [ -n "$CAKILLFILES" ]; then
    	rm -f $CACERT.??? $SERVER.??? $CACERT.srl
    fi
     
    if [ ! -f $CACERT.crt ]; then
    	# Create un-encrypted (!) key
    	$openssl req -newkey rsa:${keybits} -x509 -nodes -days $days -extensions v3_ca -keyout $CACERT.key -out $CACERT.crt -subj "${CA_DN}"
    	echo "Created CA certificate in $CACERT.crt"
    	$openssl x509 -in $CACERT.crt -nameopt multiline -subject -noout
     
    	chmod 400 $CACERT.key
    	chmod 444 $CACERT.crt
    fi
     
    if [ ! -f $SERVER.key ]; then
    	echo "--- Creating server key and signing request"
    	$openssl genrsa -out $SERVER.key $keybits
    	$openssl req -new 
    		-out $SERVER.csr 
    		-key $SERVER.key 
    		-subj "${SERVER_DN}"
    	chmod 400 $SERVER.key
    fi
     
    if [ -f $SERVER.csr -a ! -f $SERVER.crt ]; then
     
    	# There's no way to pass subjAltName on the CLI so
    	# create a cnf file and use that.
     
    	CNF=`mktemp /tmp/cacnf.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; }
    	sed -e 's/^.*%%% //' > $CNF <<!ENDconfig
    	%%% [ JPMextensions ]
    	%%% basicConstraints        = critical,CA:false
    	%%% nsCertType              = server
    	%%% keyUsage                = nonRepudiation, digitalSignature, keyEncipherment
    	%%% nsComment               = "Broker Certificate"
    	%%% subjectKeyIdentifier    = hash
    	%%% authorityKeyIdentifier  = keyid,issuer:always
    	%%% subjectAltName          = $ENV::SUBJALTNAME
    	%%% # issuerAltName           = issuer:copy
    	%%% nsCaRevocationUrl       = http://mqttitude.org/carev/
    	%%% nsRevocationUrl         = http://mqttitude.org/carev/
    !ENDconfig
     
    	SUBJALTNAME="$(addresslist)"
    	export SUBJALTNAME		# Use environment. Because I can. ;-)
     
    	echo "--- Creating and signing server certificate"
    	$openssl x509 -req 
    		-in $SERVER.csr 
    		-CA $CACERT.crt 
    		-CAkey $CACERT.key 
    		-CAcreateserial 
    		-CAserial "${DIR}/ca.srl" 
    		-out $SERVER.crt 
    		-days $days 
    		-extfile ${CNF} 
    		-extensions JPMextensions
     
    	rm -f $CNF
    	chmod 444 $SERVER.crt
    fi
    

    实际过程中大家可根据自己的需要修改这段脚本的内容,为了快速搭建我们的单向SSL, 我们这里不做任何修改,直接执行这段shell 

    执行完成后可生成  server.crt  server.csr  server.ke ca.crt  ca.key  ca.srl

    $ wget https://github.com/iandl/mqttitude/blob/master/tools/TLS/generate-CA.sh .
    $ bash ./generate-CA.sh
    

    配置mosquitto 配置文件

     

    ca.crt,  sever.crt, server.key 是上面生成的文件

    启动 broker

    启动 subscribe 端, 这里需要注意,如果sbuscreibe 端和broker 不在同一台机器,请将第一步生成的ca.crt 拷贝到 该机器的/root/certs下

     

    启动 publish 端,  如果publish 端和broker 不在同一台机器,请将第一步生成的ca.crt 拷贝到 该机器的/root/certs下



  • 相关阅读:
    query.setXXX预编译赋值 (坑爹的)
    JAVA 预编译执行SQL 之setparameterList用法
    ActiveMQ
    JavaScript DOM日记
    Mysql 详解(三)
    Mysq连接使用
    Mysql详解(二)
    Mysql详解(一)
    Spring MVC 批量导入Excel文件
    《走遍中国》珍藏版(三)
  • 原文地址:https://www.cnblogs.com/saryli/p/9821821.html
Copyright © 2011-2022 走看看