상황

리눅스에서 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