# 개발용 leaf 인증서 생성 ## 0) 사전 설치 scoop install openssl ## 1) leaf 개인키 생성 (dfxagent-bsm-lab-postgres.json 대상) ```bash cd pki mkdir leaf-dfxagent-bsm-lab-postgres cd leaf-dfxagent-bsm-lab-postgres openssl genrsa -out dfxagent-bsm-lab-postgres.key 2048 ``` --- ## 2) CSR 생성 + SAN(도메인/IP) 넣기 ### 2-1) CSR용 설정 파일 만들기: `dfxagent-bsm-lab-postgres-req.cnf` ```ini [ req ] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn req_extensions = req_ext [ dn ] C = KR O = BSM-LAB OU = KDN DFX CN = agent-bsm-lab-postgres #CN에 해당하는 값은 settings.json의 myHostId 값 기재 (mTLS에 따른 클라이언트 검증의 확인 문자로 사용함) [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = agent-bsm-lab-postgres IP.1 = 192.168.0.41 IP.2 = 172.22.1.4 IP.3 = 127.0.0.1 IP.4 = ::1 #도메인이 있는 경우에는 해당 도메인을 DNS.x에 기입 #도메인이 없는 경우에는 사용할 IP를 hosts 파일에 기술하고 해당 hostname을 DNS.x에 기입 ``` ### 2-2) CSR 생성 ```bash openssl req -new -key dfxagent-bsm-lab-postgres.key -out dfxagent-bsm-lab-postgres.csr -config dfxagent-bsm-lab-postgres-req.cnf ``` --- ## 3) Intermediate로 leaf 인증서 서명(발급) ### 3-1) leaf 확장 파일 만들기: `dfxagent-bsm-lab-postgres-leaf-ext.cnf` #### ✅ 서버용(HTTPS), mTLS 클라이언트 겸용 ```ini [ v3_server ] basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = @alt_names [ alt_names ] DNS.1 = agent-bsm-lab-postgres IP.1 = 192.168.0.41 IP.2 = 172.22.1.4 IP.3 = 127.0.0.1 IP.4 = ::1 #도메인이 있는 경우에는 해당 도메인을 DNS.x에 기입 #도메인이 없는 경우에는 사용할 IP를 hosts 파일에 기술하고 해당 hostname을 DNS.x에 기입 ``` ### 3-2) Intermediate로 서명 ```bash openssl x509 -req -in dfxagent-bsm-lab-postgres.csr -CA ..\intermediate\intermediate-kdn.crt -CAkey ..\intermediate\intermediate-kdn.key -CAcreateserial -out dfxagent-bsm-lab-postgres.crt -days 825 -sha256 -extfile dfxagent-bsm-lab-postgres-leaf-ext.cnf -extensions v3_server ``` Certificate request self-signature ok subject=C=KR, O=BSM-LAB, OU=KDN DFX, CN=agent-bsm-lab-postgres Enter pass phrase for ..\intermediate\intermediate-kdn.key: 백세민1! > `-days`는 운영 정책에 맞춰 조정(예: 365, 730 등). --- ## 4) 체인 검증(중요) ```bash openssl verify -CAfile ..\intermediate\ca-chain-kdn.crt dfxagent-bsm-lab-postgres.crt ``` `OK`가 나오는지 확인 --- ## 5) (Java/톰캣용) PKCS12 keystore(p12) 만들기 DFXAgent가 Spring Boot(내장 톰캣)이므로 `p12`를 keystore로 사용 ```bash openssl pkcs12 -export -inkey dfxagent-bsm-lab-postgres.key -in dfxagent-bsm-lab-postgres.crt -certfile ..\intermediate\ca-chain-kdn.crt -out dfxagent-bsm-lab-postgres.p12 -name agent-bsm-lab-postgres ``` Enter Export Password: 백세민1! --- # TLS 적용시 실행환경에 옵션 추가 필요 ## 1) java 옵션 설정 ### 필수 옵션 ``` -Djavax.net.ssl.trustStore="D:\projects\bsm-lab\dfx\dfxagent\src\docs\agent-bsm-lab-postgres\cert\truststore-merged.jks" -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStore="D:\projects\bsm-lab\dfx\dfxagent\src\docs\agent-bsm-lab-postgres\cert\dfxagent-bsm-lab-postgres.p12" -Djavax.net.ssl.keyStorePassword=qortpals1! -Djavax.net.ssl.keyStoreType=PKCS12 ``` ### 메모리 설정, 디버그 등 선택 옵션 ``` -Dfile.encoding=UTF-8 -Xms2048m -Xmx8192m -XshowSettings:properties -Djavax.net.debug=ssl,handshake,trustmanager ``` > 주의할 점 : -jar 옵션 앞에 위치하여야 함 ## 2) 실행 스크립트 ### 2-1) linux 환경 ```bash #!/bin/sh AGENT_HOME=/home/dfxagent/agent JAVA_OPTS="-Xms2048m -Xmx8192m" TLS_OPTS="-Djavax.net.ssl.trustStore=$AGENT_HOME/cert/truststore-merged.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStore=$AGENT_HOME/cert/dfxagent-tuf-a15-defree-oracle.p12 -Djavax.net.ssl.keyStorePassword=qortpals1! -Djavax.net.ssl.keyStoreType=PKCS12" TODAY=$(date "+%Y%m%d") #java -jar $AGENT_HOME/lib/dfxagent.jar -Xms2048m -Xmx8192m --setting.file=$AGENT_HOME/conf/settings.json & java -XX:TieredStopAtLevel=1 $JAVA_OPTS $TLS_OPTS -jar $AGENT_HOME/lib/dfxagent.jar -Xms2048m -Xmx8192m --setting.file=$AGENT_HOME/conf/settings.json & #JDK: Red Hat OpenJDK 17.0.11+9 (LTS), OS: Rocky Linux 8.10 사용 중 하기의 오류 발생 -> -XX:TieredStopAtLevel=1 추가 (C1만 사용하여 C2 비활성화) #크래시 시그널: SIGSEGV #문제 프레임: PhaseOutput::BuildOopMaps() (HotSpot C2 JIT 내부) #크래시 스레드: "C2 CompilerThread2" (JIT 컴파일러 스레드) #크래시 직전 컴파일 중이던 메서드: C2: ... org.springframework.boot.loader.net.protocol.jar.Handler::openConnection (5 bytes) ``` ### 2-2) windows 환경 ```cmd @echo off setlocal REM Update this path for your Windows environment. set "JAVA_HOME=C:\Program Files\Java\jdk-17" set "AGENT_HOME=D:\projects\bsm-lab\dfx\dfxagent\src\docs\agent-bsm-lab-postgres" set "JAVA_OPTS= -Dfile.encoding=UTF-8 -Xms2048m -Xmx8192m -XshowSettings:properties" set "TLS_OPTS= -Djavax.net.debug=ssl,handshake,trustmanager -Djavax.net.ssl.trustStore="%AGENT_HOME%\cert\truststore-merged.jks" -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStore="%AGENT_HOME%\cert\dfxagent-bsm-lab-postgres.p12" -Djavax.net.ssl.keyStorePassword=qortpals1! -Djavax.net.ssl.keyStoreType=PKCS12" for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%i" chcp 65001 REM 콘솔 출력이 필요한 경우 아래의 명령으로 실행 REM start "" cmd /c ""%JAVA_HOME%\bin\java.exe" %JAVA_OPTS% %TLS_OPTS% -jar "%AGENT_HOME%\..\..\..\build\libs\dfxagent-1.0.9.jar" --setting.file="%AGENT_HOME%\conf\dfxagent-bsm-lab-postgres.json" 1>>"dfxagent-bsm-lab-postgres-console-debug-%TODAY%.log" 2>&1" REM 일반적으로 실행할 경우 아래의 명령으로 실행 start "" "%JAVA_HOME%\bin\java.exe" %JAVA_OPTS% %TLS_OPTS% -jar "%AGENT_HOME%\..\..\..\build\libs\dfxagent-1.0.9.jar" --setting.file="%AGENT_HOME%\conf\dfxagent-bsm-lab-postgres.json" 2>&1 endlocal ``` ---