ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MQTT 브로커 (mosquitto) mosquitto.conf 파일 설정 및 openSSL 인증서 발급받아 TLS/SSL 연결 설정 하기 (2)
    DevOps 2023. 7. 20. 16:30

    mosquttio에 TLS/SSL 연결을 하기 위해서는 인증서가 필요합니다.

     

    mosquitto의 기본포트는 1883입니다. 해당 포트는 보안연결을 사용하지 않을때 쓰는 포트입니다. 

    저는 TLS/SSL 연결을 할것이기 때문에 기본포트를 8883으로 변경을 하였습니다

     

    인증서를 발급받는 방법은 여러가지가 있지만 

    저는 OpenSSL을 통해 사설 인증서를 발급 받아보겠습니다.

     

    총 두개의 인증서를 발급받아야합니다.

    • SSL/TLS 연결 시 신뢰할 수 있는 인증서 파일 
    • SSL/TLS 연결 시 신뢰할 수 있는 인증서로 서명을 한 클라이언트 인증서 파일

    클라이언트는 이 인증서 파일에서 CA의 공개 키를 확인하고 서버가 해당 CA에서 발급된 인증서를 가지고 있는지 확인하기때문에 두가지의 인증서는 필수입니다.

     

    OpenSSL 인증서 발급하기

    1. openSSL 설치

    sudo yum install openssl 

    yum을 이용해 openssl을 다운받습니다.

    [user01@test ~]$ sudo yum install openssl
    [sudo] password for user01:
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
     * epel: mirror-icn.yuki.net.uk
    Package 1:openssl-1.0.2k-26.el7_9.x86_64 already installed and latest version
    Nothing to do

    전 이미 다운받아서 이렇게 뜹니다.

     

     

    2. SSL/TLS 연결 시 신뢰할 수 있는 인증서 파일(ca.crt) 생성

    1) 인증용 개인키(ca.key) 발급

    저는 /home/user01/Cert/ca 경로에 인증용 인증서 파일을 생성하겠습니다.

    openssl genpkey -algorithm RSA -out ca.key;
    [user01@test ca]$ openssl genpkey -algorithm RSA -out ca.key;
    ..................++++++
    .++++++

    해당 작업을 진행하게되면 key가 저장됩니다.

    키를 생성하는 명령어

    • genpkey : OpenSSL의 genpkey 명령어를 사용하여 RSA 알고리즘으로 개인 키를 생성합니다.
      • 암호화되지 않은 개인 키와 해당 키에 대한 공개 키 쌍을 생성합니다.
        결과 파일로 privateTest.key에 암호화되지 않은 개인 키와 공개 키 쌍이 함께 저장됩니다
    • genrsa : genpkey 처럼 개인키를 생성하는 명령어입니다. 다만 다른점은, 암호화 되지않은 개인키만 생성합니다.따라서 서명(Signing)과 복호화(Decryption) 등의 암호화 기능을 수행할 수 있지만, 공개키를 이용해서 암호화된 데이터를 복호화 하거나, 디지털 서명을 확인하는 등의 작업을 수행할 수 없습니다.

    비대칭키 암호화 RSA 란?

    더보기
    비대칭 키 암호화 (RSA):

    비대칭 키 암호화는 암호화와 복호화에 서로 다른 키를 사용하는 방식입니다.
    암호화에 사용되는 키를 공개 키(public key)라고 하며, 
    복호화에 사용되는 키를 개인 키(private key)라고 합니다.

    공개 키로 암호화된 데이터는 개인 키로만 복호화할 수 있으며, 
    개인 키로 서명된 데이터는 공개 키로만 확인할 수 있습니다.

    비대칭 키 암호화 방식은 보안적으로 강력하며, 
    공개 키는 공개되어 있어도 개인 키는 개인이 보관하므로 안전성이 보장됩니다.

    RSA 알고리즘은 비대칭 키 암호화 방식의 대표적인 예시입니다.

     

    2) 인증용 개인키를 이용하여 인증서 요청 파일(Certificate Signing Request/ .csr) 생성

    openssl req -new -key ca.key -out ca.csr

    아까 생성한 ca.key를 이용하여 ca이름을 가진 인증서 요청 파일을 생성합니다.

     

    해당 명령을 수행하게 되면, 여러가지를 입력하라고 뜹니다.

    아래의 요소들을 입력하라고 뜨는데 단순 식별을 위한 정보라 선택적으로 입력하시면 됩니다.

    Common Name 는 꼭 확인하고 제대로 명시하셔야합니다. 해당 서버의 도메인 또는 IP 주소를 입력해야합니다.

    • Country Name (2 letter code) [XX]: KR
    • State or Province Name (full name) []: Seoul
    • Locality Name (eg, city) [Default City]: Gangnam
    • Organization Name (eg, company) [Default Company Ltd]: 회사명
    • Organizational Unit Name (eg, section) []: 부서명
    • Common Name (eg, your name or your server's hostname) []: 해당 서버 도메인 또는 IP 주소
    • Email Address []: 이메일

    이렇게까지 입력하고 나면 추가정보를 입력하라고 뜹니다.

    • A challenge password []: 암호 설정

    해당 암호를 설정하게 되면 OpenSSL을 사용하여 SSL 인증서 요청(Certificate Signing Request, CSR)을 생성할 때 해당암호를 묻게 됩니다. 이 암호는 개인 키(Private Key)를 보호하기 위해 사용될 수 있습니다.

    • An optional company name []: 회사명 (선택)

    모든 입력이 끝나면, ca.csr 파일이 생겼습니다.

    [user01@test ca]$ openssl req -new -key privateTest.key -out csrTest.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:KR
    State or Province Name (full name) []:Seoul
    Locality Name (eg, city) [Default City]:Gangnam
    Organization Name (eg, company) [Default Company Ltd]:test Company
    Organizational Unit Name (eg, section) []:test Team
    Common Name (eg, your name or your server's hostname) []:서버 ip
    Email Address []:test@test.co.kr
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:testpwd
    An optional company name []:test Company

     

    3) 생성된 개인키와 인증서 생성파일을 이용해 인증서 발급받기

    openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt

    해당 명령은 OpenSSL을 사용하여 CSR(Certificate Signing Request) 파일(csrTest.csr)과 개인 키(privateTest.key)를 바탕으로 새로운 X.509 형식의 인증서(testCrt.crt)를 생성하는 명령입니다.

    • x509: X.509 형식의 인증서를 생성하는 명령입니다.
    • -req: CSR 파일(csrTest.csr)을 인증서로 변환하는데 필요한 요청(RSA 공개 키, DN 정보 등)을 사용합니다.
    • -days 3650: 생성되는 인증서의 유효 기간을 설정합니다. 이 경우 3650일(약 10년) 동안 유효한 인증서가 생성됩니다.
    • -in csrTest.csr: 입력으로 사용될 CSR 파일의 경로와 파일명을 지정합니다.
    • -signkey privateTest.key: CSR 파일(csrTest.csr)과 함께 사용될 개인 키 파일(privateTest.key)을 지정합니다. 이 개인 키를 사용하여 CSR의 서명을 검증하고 인증서를 생성합니다.
    • -out testCrt.crt: 생성된 X.509 형식의 인증서를 저장할 파일의 경로와 파일명을 지정합니다. 생성된 인증서는 testCrt.crt로 저장됩니다.

    이렇게 해서 인증용 인증서 까지 발급하였습니다.

    해당 인증서(ca.crt는) ca.key를 사용하여 서명된 자체 서명된 CA 인증서입니다

     

     

     

    이제 발급된 인증서를 가지고 mosquitto에 등록시켜보겠습니다.

    [user01@test ca]$ openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
    Signature ok
    subject=/C=KR/ST=Seoul/L=Gangnam/O=회사명/OU=부서명/CN=서버ip1/emailAddress=이메일
    Getting Private key

     

    3. SSL/TLS 연결 시 신뢰할 수 있는 인증서로 서명을 한
    클라이언트 인증서 파일 생성

    1) 클라이언트 개인키(client.key) 발급

    저는 /home/user01/Cert/test 경로로 이동하여 발급 받겠습니다. 발급 방법은 위와 동일합니다.

    openssl genpkey -algorithm RSA -out client.key;
    [user01@test test]$ openssl genpkey -algorithm RSA -out client.key;
    ..................++++++
    .++++++

    해당 작업을 진행하게되면 key가 저장됩니다.

     

    2) 클라이언트 개인키를 이용하여 인증서 요청 파일(Certificate Signing Request/ .csr) 생성

    openssl req -new -key client.key -out client.csr

    아까 생성한 client.key를 이용하여 client 라는 이름을 가진 인증서 요청 파일을 생성합니다.

    3) 인증용 개인키와 인증용 인증서를 이용해 클라이언트 인증서 생성

    openssl x509 -req -days 3650 -in client.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key -CAcreateserial -out client.crt
    • -CA : CA의 인증서 파일을 지정합니다. 인증서의 서명에 사용이 되는 인증서입니다
    • -CAkey : CA의 개인키 파일을 지정합니다. 이 값은 인증서와 함께 사용이 됩니다. 
    • -CAcreateserial : CA가 새로운 인증서를 서명할때 사용됩니다. 새로운 인증서를 발급하고 서명하는 과정에서 시리얼 넘버 파일을 생성합니다(.srl) 
      • 이 파일은 인증서의 유일성을 보장하기 위해 사용됩니다.

    이렇게 client.crt가 생긴것을 확인 할 수 있습니다.

    [user01@test test]$ openssl x509 -req -days 3650 -in client.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key -CAcreateserial -out client.crt
    Signature ok
    subject=/C=KR/ST=Gangnam/L=Seoul/O=회사명/OU=부서명/CN=ip주소/emailAddress=이메일주소
    Getting CA Private Key

     

    이렇게 만들어진 인증서와 키는 mosquitto.conf에 설정하면 됩니다.

    총 3개의 파일을 사용합니다.

    • ca.crt
    • client.crt
    • client.key

     

    설정파일에서 몇가지 설정을 주석 해제 및 변경 해주시면 됩니다.

    Default listener (기본으로 사용할 리스너)
    • bind_address : mosquitto가 리스닝할 네트워크 인터페이스의 IP 주소를 설정합니다.
    #bind_address

    저의 경우에는 여러 호스트에서 mosquitto로 메시지를 보내기때문에 설정해주지 않겠습니다.

    • port : 기본 연결인 경우 1883을 사용, TLS/SSL 연결인 경우 8883 사용
    port 8883
    • protocol : 기본적으로는 mqtt 프로토콜 을 사용하기때문에 mqtt를 써주시면 됩니다.
      HTTP 통신을 원하면 websockets을 입력해주시면 됩니다
    protocol mqtt
    • cafile : SSL/TLS 연결 시 신뢰할 수 있는 인증서 파일을 지정하는 옵션입니다.

    위에서 생성한 CA인증서를 넣어줍니다.

    cafile /home/user01/Cert/ca/ca.crt
    • certfile: SSL/TLS 연결 시 클라이언트 인증서 파일의 경로를 입력합니다.

    위에서 생성한 클라이언트 인증서 파일의 경로를 넣어줍니다.

    certfile /home/user01/Cert/test/client.crt
    • keyfile: SSL/TLS 연결 시 클라이언트 개인 키 파일의 경로를 입력합니다.

    위에서 생성한 클라이언트 개인키 파일의 경로를 넣어줍니다.

    keyfile /home/user01/Cert/test/client.key
    • require_certificate  : 모든 클라이언트가 TLS/SSL 인증서를 제공해야지만 연결이 가능하다. (true/false)
    require_certificate false
    • tls_version:  SSL/TLS 프로토콜 버전 (1.2가 주로 사용된다) , 사용하지않는다면 주석 처리해주세요
    tls_version tlsv1.2
    • autosave_interval  :설정 파일을 자동으로 저장하는 기능 (주기)
      설정 변경 사항을 자동으로 저장 및 보존이 가능하며 재시작시에도 최신 설정 유지
    autosave_interval 3600
    • autosave_on_changes : 설정 파일 변경사항 있을시 자동저장 (true/false)
      autosave_interval 와 연관이 있음 false인 경우 해당 주기가 되야지만 저장이 된다.
    autosave_on_changes true
    • persistence : 메시지를 디스크에 유지하고 재시작 후에도 지속성 있는 메시지 전달을 지원하는 옵션 (true/false)
    persistence true
    • persistence_file : 디스크에 메시지 파일 저장하는 형식 (디폴트 : mosquitto.db)
    persistence_file mosquitto.db
    • persistence_location :  디스크에 메시지 파일 저장하는 경로 (디폴트 : mosquitto가 실행중인 디렉토리)
    persistence_location /var/lib/mosquitto/
    • allow_anonymous  :사용자 이름과 비밀번호 없이도 연결을 허용할지 (디폴트: true)
    allow_anonymous true

     

    이렇게 설정후 mosquitto을 재실행하면 됩니다.

     

    실행후 상태를 확인해보면 8883으로 실행된것을 확인할 수 있습니다.

    [user01@test ~]$ service mosquitto start
    [user01@test ~]$ service mosquitto status
    Redirecting to /bin/systemctl status mosquitto.service
    ● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
       Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; disabled; vendor preset: disabled)
       Active: active (running) since Tue 2023-07-25 18:55:38 KST; 13s ago
         Docs: man:mosquitto.conf(5)
               man:mosquitto(8)
     Main PID: 264134 (mosquitto)
       CGroup: /system.slice/mosquitto.service
               └─264134 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
    
    Jul 25 18:55:38 communication2 systemd[1]: Starting Mosquitto MQTT v3.1/v3.1.1 Broker...
    Jul 25 18:55:38 communication2 mosquitto[264134]: 1690278938: mosquitto version 1.6.10 starting
    Jul 25 18:55:38 communication2 mosquitto[264134]: 1690278938: Config loaded from /etc/mosquitto/mosquitto.conf.
    Jul 25 18:55:38 communication2 mosquitto[264134]: 1690278938: Opening ipv4 listen socket on port 8883.
    Jul 25 18:55:38 communication2 mosquitto[264134]: 1690278938: Opening ipv6 listen socket on port 8883.
    Jul 25 18:55:38 communication2 systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Broker.

    'DevOps' 카테고리의 다른 글

    MQTT 브로커 (mosquitto) 설치 및 테스트 (1)  (0) 2023.07.18
Designed by Tistory.