linux - dcmtk - tls 적용해서 dicom 전송하기

상황

리눅스에서 DICOM을 서버 A에서 서버 B로 전송해야한다.
보안문제로 사설인증서 또는 공인인증서를 써야한다.

방법

dcmtk를 이용해서 DICOM을 전송한다.
storescp, storescu의 tls옵션으로 인증서를 적용한다.

사설 인증서로 TLS 적용

1. 키 만들기

서버 두개가 있다.
  • Sender : 파일을 보내는 서버
  • Receiver : Sender로부터 파일을 받는 서버

각 서버의 private key와 public key를 만든다.
  • Sender 서버의 private key(sender.key)와 public key(sender.crt)를 생성한다.
    $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
       -keyout sender.key -out sender.crt -subj "/C=BE/CN=localhost"
  • Receiver 서버의 private key(receiver.key)와 publick key(receiver.crt)를 생성한다.
    $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
       -keyout receiver.key -out receiver.crt -subj "/C=BE/CN=localhost"


2. Public key 교환

서로의 public key를 공유한다. 그럼 각 서버에 아래 파일들을 가지게 된다.
  • Sender : sender.key, sender.crt, receiver.crt
  • Receiver : receiver.key, receiver.crt, sender.crt


3. Receiver에서 storescp를 실행, DICOM 파일을 받을 준비한다.

$ storescp +xa +uf -xs -od /home/jihoon/recv \
   --aetitle receiver 13000 -fe .dcm \
   +tls ./receiver.key ./receiver.crt +cf ./sender.crt
명령어를 해석하자면,
receiver 서버로 dicom을 수신할건데,
파일은 .dcm 으로 저장하고, 저장위치는 /home/jihoon/recv 디렉토리,
receiver의 ae title은 receiver로 하고,
port 13000으로 받는다.
tls 옵션을 쓰려면, receiver의 개인키+공개키와 보내는 쪽의 공개키를 포함한다.
옵션 참고 링크 : https://support.dcmtk.org/docs/storescp.html

Option +cf OR -ic

+cf 옵션을 쓰면 파일을 보내는 서버의 공개키를 파일을 받는 서버에 등록해야한다.
인증된 서버에게서만 파일을 받게되는 것.
그냥 아무서버에서나 파일을 받고 싶으면 +cf 대신 -ic 옵션을쓰고 보내는 서버의 개인키를 업로드 하지 않으면 된다.

4. sender 서버에서 storescu 이용, DICOM을 receiver 서버로 전송

storescu {sender's ipaddress} 13000 ./test.dcm \
   +tls ./sender.key ./sender.crt +cf ./receiver-CA.crt -aet sender -ll debug


공인 인증서로 TLS 적용

1. 키 만들기

공인 인증서를 발급받는 방법은 생략한다.
pfx 파일이 있는 경우, 아래 명령어로 .key과 .crt파일, 그리고 CA Certificate을 추출할수 있다.
  • .pfx -> .key 추출하기
    $ openssl pkcs12 -in sender.pfx -nocerts -nodes -out sender.key
    $ openssl pkcs12 -in receiver.pfx -nocerts -nodes -out receiver.key>
  • .pfx -> .crt 추출하기
    $ openssl pkcs12 -in sender.pfx -clcerts -nokeys -out sender.crt  
    $ openssl pkcs12 -in receiver.pfx -clcerts -nokeys -out receiver.crt
  • .pfx -> CA certificate 추출하기
    $ openssl pkcs12 -in sender.pfx -nodes -nokeys -cacerts -out sender-CA.crt 
    $ openssl pkcs12 -in receiver.pfx -nodes -nokeys -cacerts -out receiver-CA.crt



2. CA Cerificate 교환

사설 인증서 이용할 때는 public key를 공유했고, CA certificate 이용할때는 CA certificate를 공유한다.
그럼 각 서버에 아래 파일들을 가지게 된다.
  • Sender : sender.key, sender.crt, receiver-CA.crt
  • Receiver : receiver.key, receiver.crt, sender-CA.crt


3. Receiver에서 storescp를 실행, DICOM 파일을 받을 준비한다.

$ storescp +xa +uf -xs -od /home/jihoon/recv \
   --aetitle receiver 13000 -fe .dcm \
   +tls ./receiver.key ./receiver.crt +cf ./sender-CA.crt
   
+tls옵션에서 +cf 이용시, sender의 public key 대신 CA certificate를 이용하는 것만 다르다.

4. sender 서버에서 storescu 이용, DICOM을 receiver 서버로 전송

storescu {sender's ipaddress} 13000 ./test.dcm \
   +tls ./sender.key ./sender.crt +cf ./receiver-CA.crt -aet sender -ll debug

댓글 쓰기

0 댓글