error

java.net.SocketException:A system call received a parameter that is not valid.

dddzr 2025. 12. 18. 06:50

๐Ÿ“Œ IBM JDK (WebSphere) ํ™˜๊ฒฝ์—์„œ HTTPS API ํ˜ธ์ถœ ์‹œ A system call received a parameter that is not valid ์—๋Ÿฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

 

๐Ÿš€ ๊ฒฐ๋ก  ์š”์•ฝ

1. ์—๋Ÿฌ๋Š” HTTP(APIํ˜ธ์ถœ) ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€๊ฒŒ ์•„๋‹ˆ๋ผ socket / protocol ์ƒํƒœ์ด๋‹ค.

2. ์„œ๋ฒ„(WebSphere)์—์„œ ์™ธ๋ถ€ HTTPS๋กœ ๋‚˜๊ฐ€๋Š” Outbound TLS ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋จ. 

    → ์ด๋Š” ๋„คํŠธ์›Œํฌ/๋ณด์•ˆ ์žฅ๋น„ ์ •์ฑ… ์˜์—ญ์œผ๋กœ ๋ณด์•ˆํŒ€์—Outbound ํ—ˆ์šฉ(SSL Inspection ์˜ˆ์™ธ) ์š”์ฒญ์ด ํ•„์š”ํ•จ.

3. 2๋ฒˆ์ด ์•„๋‹ˆ๋ผ๋ฉด API์„œ๋ฒ„ ์ธก legacy SSL ์‚ฌ์šฉ์„ ์˜์‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ” 1. ๋ฌธ์ œ ์ฆ์ƒ

Spring ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜์—์„œ ์™ธ๋ถ€ HTTPS API ํ˜ธ์ถœ ์‹œ 

  • ๋กœ์ปฌ PC(Windows)์—์„œ๋Š” ์ •์ƒ ๋™์ž‘
  • ๊ฐœ๋ฐœ ์„œ๋ฒ„(WebSphere)์—์„œ ์•„๋ž˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
ERROR=org.springframework.web.client.ResourceAccessException:
I/O error on POST request for "https://api.example.com/api/apiurl":
A system call received a parameter that is not valid.;
nested exception is java.net.SocketException:
A system call received a parameter that is not valid.

 

HTTPS POST ์‹œ SocketException ์ด๊ณ ,  ์—๋Ÿฌ ํฌ์ธํŠธ๋Š” Spring RestTemplate → SSL ์†Œ์ผ“ ์ƒ์„ฑ ๋‹จ๊ณ„.

ResourceAccessException

 โ””โ”€ java.net.SocketException

    A system call received a parameter that is not valid

์ด ์—๋Ÿฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ “JVM + OS + SSL ์„ค์ •” ๋ฌธ์ œ์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค.

๐ŸŒŸ์—๋Ÿฌ ์ „ํŒŒ ํ๋ฆ„

[ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„]
 TLS ClientHello ์ „์†ก ์‹œ๋„
        ↓
[๋„คํŠธ์›Œํฌ/๋ณด์•ˆ ๊ณ„์ธต]
 ์•„์›ƒ๋ฐ”์šด๋“œ TLS ์ฐจ๋‹จ ๋˜๋Š” RST
        ↓
[IBM JDK JSSE2]
 ์ •์ƒ์ ์ธ TLS ์‘๋‹ต ์ˆ˜์‹  ๋ถˆ๊ฐ€
        ↓
[OS Socket Layer]
 ์†Œ์ผ“ write ์‹คํŒจ → invalid parameter
        ↓
[java.net.SocketException]
        ↓
[Spring ResourceAccessException]

๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” parameter๋Š”
HTTP(APIํ˜ธ์ถœ) ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ socket / protocol ์ƒํƒœ

 

โœ… ์‹คํ–‰ ๋ฐฉ๋ฒ•

*๋กœ์ปฌ ์‹คํ–‰ (์ง์ ‘ ํ„ฐ๋ฏธ๋„์—์„œ)

java \
  -Dapp.home=./config \
  -cp "bin;lib/*" \
  com.example.batch.MainApplication \
  {MODE} {TARGET}

 

*์„œ๋ฒ„ ์‹คํ–‰ (sh ์ผ๋ถ€)

/path/to/java/bin/java \
  -Dfile.encoding=UTF-8 \
  -classpath ${CLASSPATH} ${JAVA_OPTIONS} \
  -Xms256M -Xmx1024M \
  com.example.batch.MainApplication \
  ${MODE} ${TARGET} \
  > ${LOG_HOME}/batch_${TARGET}_${MODE}_$(date +%Y%m%d).log 2>&1 &

 


๐Ÿ“Œ 2. TLS(SSL)ํ†ต์‹  ํ™•์ธ

๐Ÿ“Œ 2-1. ์„œ๋ฒ„(WebSphere)  - openssl

*์˜ค๋ž˜๋œ ์„œ๋ฒ„๋ผ curl ์„ค์น˜ ์•ˆ ๋˜์–ด์žˆ์Œ (์•„๋งˆ CentOS).

AIX / IBM ์„œ๋ฒ„์—๋Š” openssl์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ.

 

โœ… openssl

openssl s_client๋Š” TLS(SSL) ํด๋ผ์ด์–ธํŠธ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ, HTTPS ํ†ต์‹ ์—์„œ HTTP๋ฅผ ์ œ์™ธํ•œ TLS ๊ณ„์ธต๊นŒ์ง€๋งŒ ๊ฒ€์ฆํ•œ๋‹ค.

๐Ÿ‘‰์ฆ‰, Java(Spring RestTemplate)์˜ HTTPS ํ†ต์‹  ์ค‘  TLS Handshake ๋‹จ๊ณ„๊นŒ์ง€๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์žฌํ˜„.

 

โœ”๏ธ openssl ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„

  1. TCP 443 ์—ฐ๊ฒฐ
  2. TLS ClientHello ์ „์†ก
  3. ์„œ๋ฒ„์™€ Cipher Suite ํ˜‘์ƒ
  4. ์„œ๋ฒ„ ์ธ์ฆ์„œ ์ˆ˜์‹ 
  5. ์ธ์ฆ์„œ ์ฒด์ธ ๊ฒ€์ฆ
  6. TLS Handshake ์™„๋ฃŒ ์—ฌ๋ถ€ ํ™•์ธ
    * HTTP ์š”์ฒญ(GET/POST)์€ ์ „์†กํ•˜์ง€ ์•Š์Œ → TLS ๊ณ„์ธต๋งŒ ๋‹จ๋…์œผ๋กœ ๊ฒ€์ฆ

 

์‹คํ–‰

$ openssl s_client -connect api.example.com:443 -tls1_2

 

๊ฒฐ๊ณผ

**๋งŒ์•ฝ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋ž˜์™€ ๋‹ค๋ฅด๋‹ค๋ฉด ๋‹ค๋ฅธ ์›์ธ์ด๋‹ค. 3~5 ์ฐธ๊ณ !!

CONNECTED(00000003)
write:errno=73
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1765933594
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

 

ํ•ด์„

โœ”๏ธ CONNECTED

  • TCP 443 ์—ฐ๊ฒฐ ์„ฑ๊ณต → ๋ฐฉํ™”๋ฒฝ / L4 ๋ฌธ์ œ x

โŒ write:errno=73

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ClientHello๋ฅผ ๋ณด๋‚ด๋ ค๋Š” ์ˆœ๊ฐ„ OS ๋ ˆ๋ฒจ์—์„œ write ์‹คํŒจ
  • AIX ๊ธฐ์ค€ errno 73 = Protocol error / invalid argument ๊ณ„์—ด
  • ๐Ÿ‘‰ ์ฆ‰, TLS ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ์ƒ๋Œ€์—๊ฒŒ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์ปค๋„/๋ณด์•ˆ ๊ณ„์ธต์—์„œ ์ฐจ๋‹จ

 

โŒ no peer certificate

  • ์„œ๋ฒ„๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์‘๋‹ต ์•ˆ ํ•จ
  • ์ธ์ฆ์„œ ๋ฌธ์ œ โŒ (์•„์ง ๊ฑฐ๊ธฐ๊นŒ์ง€๋„ ๋ชป ๊ฐ)

 

โŒ read/write 0 bytes

  • TLS Handshake ์‹œ์ž‘์กฐ์ฐจ ์•ˆ ๋จ
  • ์ƒ๋Œ€ ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ์„œ๋ฅผ ๋ณด๋‚ธ ๊ฒŒ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ ์ชฝ์—์„œ ํŒจํ‚ท์„ ๋ชป ๋‚ด๋ณด๋ƒ„

 

โ“ API ์ œ๊ณต์ž ๋ฌธ์ œ์ผ ๊ฒฝ์šฐ

  • ClientHello๋Š” ๋‚˜๊ฐ
  • ServerHello / ์ธ์ฆ์„œ ์‘๋‹ต ์žˆ์Œ
  • handshake_failure / bad_certificate ๊ฐ™์€ ์—๋Ÿฌ ๋ฐœ์ƒ

 

๐Ÿš€ ๊ฒฐ๋ก 

์„œ๋ฒ„ → ์™ธ๋ถ€ ๋ฐฉํ–ฅ(outbound) TLS ์ฐจ๋‹จ

์„œ๋ฒ„์—์„œ ์™ธ๋ถ€ HTTPS(API) ํ˜ธ์ถœ ์‹œ, TCP 443 ์—ฐ๊ฒฐ์€ ์ •์ƒ์ด๋‚˜ TLS ClientHello ๋‹จ๊ณ„์—์„œ

openssl s_client -tls1_2 ๊ธฐ์ค€ write errno=73 ๋ฐœ์ƒํ•˜๋ฉฐ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ SSL ์‘๋‹ต ์ˆ˜์‹ ๋˜์ง€ ์•Š์Œ.

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Java/Spring)๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ OS/๋ณด์•ˆ/๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ์—์„œ ์•„์›ƒ๋ฐ”์šด๋“œ TLS๊ฐ€ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ํ•ด๋‹น ์„œ๋ฒ„ → api.example.com:443 ๊ฒฝ๋กœ์— ๋Œ€ํ•ด SSL Inspection ๋˜๋Š” ๋ณด์•ˆ ์ •์ฑ… ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค.

 

๐Ÿ“Œ 2-2. ๋กœ์ปฌ - curl (์•ˆ ํ•ด๋„ ๋จ. ์„œ๋ฒ„์™€ ๋น„๊ต)

โœ… curl

curl์€ HTTPS ํด๋ผ์ด์–ธํŠธ, HTTPS ํ†ต์‹ (TLS ํ˜‘์ƒ) ํ™•์ธ

๐Ÿ‘‰ Java(Spring RestTemplate)๊ฐ€ ํ•˜๋Š” ๋™์ž‘์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์žฌํ˜„

 

โœ”๏ธ curl ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„

  1. TCP 443 ์—ฐ๊ฒฐ
  2. TLS ClientHello
  3. ์„œ๋ฒ„์™€ Cipher ํ˜‘์ƒ
  4. ์„œ๋ฒ„ ์ธ์ฆ์„œ ์ˆ˜์‹ 
  5. ์ธ์ฆ์„œ ๊ฒ€์ฆ
  6. HTTP ์š”์ฒญ ์ „์†ก

 

์‹œ๋„

 curl -vk https://api.example.com/…
  • -v : TLS Handshake ์ƒ์„ธ ์ถœ๋ ฅ
  • -k : ์ธ์ฆ์„œ ๊ฒ€์ฆ ๋ฌด์‹œ (CA ๋ฌธ์ œ ๋ฐฐ์ œ์šฉ)

 

๊ฒฐ๊ณผ

* Host api.example.com:443 was resolved.
* IPv6: (none)
* IPv4: 211.46.114.70
*   Trying 111.11.111.11:443...
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server did not agree on a protocol. Uses default.
* Connected to api.example.com (111.11.111.11) port 443
* using HTTP/1.x
> GET /... HTTP/1.1
> Host: api.example.com
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Wed, 17 Dec 2025 01:23:13 GMT
< Content-Type: text/html
< Content-Length: 146
< Connection: keep-alive
< Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
<
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host api.example.com left intact

 

ํ•ด์„

โœ”๏ธ DNS / ๋„คํŠธ์›Œํฌ

* Connected to api.example.com (111.11.111.11) port 443

  • DNS ์ •์ƒ, TCP 443 ์ •์ƒ  → ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์—†์Œ

 

โœ”๏ธ TLS(SSL) ๊ณ„์ธต (๊ฐ€์žฅ ์ค‘์š”)

* schannel: disabled automatic use of client certificate

* ALPN: curl offers http/1.1

* ALPN: server did not agree on a protocol. Uses default.

  • schannel → Windows TLS ์Šคํƒ
  • TLS handshake ์ •์ƒ ์™„๋ฃŒ, ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต ๐Ÿ‘‰ TLS ํ˜‘์ƒ ์„ฑ๊ณต
  • *ALPN์€ ์„ ํƒ ์‚ฌํ•ญ → ๋ฌธ์ œ ์•„๋‹˜

 

โœ”๏ธ HTTP ๊ณ„์ธต

> GET /... HTTP/1.1

< HTTP/1.1 404 Not Found

< Server: nginx

  • โ“TLS ์‹คํŒจ์˜€๋‹ค๋ฉด → ์—ฌ๊ธฐ๊นŒ์ง€ ๋ชป ์˜ด
  • โ“์ธ์ฆ์„œ ๋ฌธ์ œ์˜€๋‹ค๋ฉด → handshake ๋‹จ๊ณ„์—์„œ ์ปท
  • โ“API ์„œ๋ฒ„ ๋ฌธ์ œ์˜€๋‹ค๋ฉด → 5xx ๊ฐ€๋Šฅ์„ฑ
  • *404๋Š” URL ๊ฒฝ๋กœ ๋ฌธ์ œ์ผ ๋ฟ, ํ†ต์‹  ์„ฑ๊ณต์˜ ์ฆ๊ฑฐ์ž„
  • nginx๊ฐ€ ์š”์ฒญ์„ “๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ”ํ•จ

 


๐Ÿ“Œ 3. (์ฐธ๊ณ ) API ์„œ๋ฒ„ ์ธก ์‘๋‹ต ๋ฐ›์•˜๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค ์ •๋ฆฌ

โš ๏ธ ๋ณธ ํ•ญ๋ชฉ์€ ์‹ค์ œ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์ด ์•„๋‹Œ, ๊ฐ€์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ์ •๋ฆฌ์ž„. ๋‚˜๋Š” 2๋ฒˆ์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋„ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์–ด์„œ ์ •๋ฆฌํ•จ.

โœ… 3-1. TLS ๋‹จ๊ณ„์—์„œ ๋‹ค๋ฅธ ์‘๋‹ต์„ ๋ฐ›์•˜์„ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ํ•ด์„

openssl s_client -connect api.example.com:443 -tls1_2

 

๐Ÿ”น legacy SSL ์‘๋‹ต ์˜ˆ์‹œ → API์„œ๋ฒ„ ๋˜๋Š” ์•ž๋‹จ SSL ์žฅ๋น„์˜ legacy SSL ๊ตฌํ˜„ ๊ฐ€๋Šฅ์„ฑ

CONNECTED(00000003)

SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

SSL alert number 40

 

๐Ÿ”น SSLv3 only / downgrade ์˜ˆ์‹œ → API SSLv3 ๊ธฐ๋ฐ˜ ์‘๋‹ต

CONNECTED(00000003)

wrong version number

 

๐Ÿ”น ServerHello๊นŒ์ง€๋Š” ๋„๋‹ฌ, Java์—์„œ๋งŒ ์‹คํŒจ → IBM JDK์˜ SSL ์ •์ฑ…/๊ตฌํ˜„ ์ฐจ์ด

CONNECTED(00000003)

depth=0 CN=*.lghnh.com

verify return:1

---

SSL-Session:

    Protocol  : TLSv1.2

    Cipher    : ECDHE_RSA_AES_128_GCM_SHA256

 


๐Ÿ“Œ4. JVM ์˜ต์…˜ ์ ๊ฒ€ (๊ฐ€๋Šฅ์„ฑ ๋ฐฐ์ œ ๋‹จ๊ณ„)

โœ… ์‹œ๋„ํ•œ ์˜ต์…˜๋“ค

-Djava.net.preferIPv4Stack=true

-Dhttps.protocols=TLSv1.2

-Djdk.tls.client.protocols=TLSv1.2

 

๐Ÿ“Œ 4-1. -Djava.net.preferIPv4Stack=true

๋ชฉ์ 

  • IPv6 / IPv4 ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ์ œ๊ฑฐ
  • JVM์ด ์†Œ์ผ“ ์ƒ์„ฑ ์‹œ IPv4๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œ
  • ์„œ๋ฒ„๊ฐ€ IPv6 ์ฃผ์†Œ๋ฅผ ๋จผ์ € ์žก๋Š”๋ฐ ๋ฐฉํ™”๋ฒฝ / ๋„คํŠธ์›Œํฌ๊ฐ€ IPv6์„ ๋ง‰๊ณ  ์žˆ์„ ๋•Œ ์œ„ํ•จ

๊ฒฐ๊ณผ

  • telnet์œผ๋กœ TCP ์—ฐ๊ฒฐ ์ •์ƒ → DNS / IP ๋ฌธ์ œ ์—†์Œ
  • ์—๋Ÿฌ ๋ฐœ์ƒ ์ง€์ ์€ SSL Handshake ๋‹จ๊ณ„
  • โŒ ์ด๋ฒˆ ์ด์Šˆ์™€ ๋ฌด๊ด€

 

๐Ÿ“Œ 4-2. -Dhttps.protocols=TLSv1.2, -Djdk.tls.client.protocols=TLSv1.2

* -Dhttps.protocols๋Š” HTTPS ์ „์šฉ ์˜ต์…˜,  -Djdk.tls.client.protocols๋Š” JDK JSSE ๋ ˆ๋ฒจ ์˜ต์…˜์œผ๋กœ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฆ„.

 

๋ชฉ์ 

  • SSLv3 / TLS1.0 ์‚ฌ์šฉ ๋ฐฉ์ง€ TLSv1.2 ์‚ฌ์šฉ ๊ฐ•์ œ
  • JVM์ด TLSv1.2๊ฐ€ ์•„๋‹Œ ํ”„๋กœํ† ์ฝœ๋กœ ํ†ต์‹ ์„ ์‹œ๋„ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ๊ฒ€์ฆ

๊ฒฐ๊ณผ

CLIENT_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]

  • JVM์€ ์ด๋ฏธ TLSv1.2๋กœ ํ†ต์‹  ์‹œ๋„ ์ค‘
  • โŒ JVM ๋ฌธ์ œ ์•„๋‹˜

 

๐Ÿš€ 4-3. JVM ์˜ต์…˜ ์ ๊ฒ€ ๊ฒฐ๋ก 

๊ฐ€๋Šฅ์„ฑ ๊ฒฐ๊ณผ
IPv6 ์ถฉ๋Œ โŒ ์•„๋‹˜
JVM์ด SSLv3๋กœ ํ†ต์‹  ์‹œ๋„ โŒ ์•„๋‹˜
TLS ๋ฒ„์ „ ๋ฏธ์ง€์ • โŒ ์•„๋‹˜

๐Ÿ‘‰ JVM ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์›์ธ ๋ฐฐ์ œ ์™„๋ฃŒ


๐Ÿ“Œ 5. SSL ๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๋ถ„์„

๋””๋ฒ„๊ทธ ์˜ต์…˜ ์ถ”๊ฐ€

-Djavax.net.debug=ssl,handshake

 

์„œ๋ฒ„ ๋กœ๊ทธ

SSLv3 protocol was requested but was not enabled

IBMJSSE2 will not allow protocol SSLv3

 

*๋กœ์ปฌ(Oracle JDK) ๋กœ๊ทธ (์ฐธ๊ณ ์šฉ)

java -Djavax.net.debug=ssl,handshake -cp . apiReqSample > ssl_debug.log 2>&1 &

javax.net.ssl|DEBUG|30|main|2025-12-16 09:23:48.933 KST|SSLExtensions.java:272|Ignore, context unavailable extension: pre_shared_key
javax.net.ssl|DEBUG|30|main|2025-12-16 09:23:48.936 KST|ClientHello.java:638|Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.2",
//…
})

javax.net.ssl|DEBUG|30|main|2025-12-16 09:23:51.969 KST|ServerHello.java:877|Consuming ServerHello handshake message (
"ServerHello": {
  "server version"      : "TLSv1.2",
  "random"              : "{๋ฌธ์ž์—ด}",
  "session id"          : "{๋ฌธ์ž์—ด}",
  "cipher suite"        : "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F)",
  "compression methods" : "00",
  "extensions"          : [
    "renegotiation_info (65,281)": {
      "renegotiated connection": [<no renegotiated connection>]
    },
    "server_name (0)": {
      <empty extension_data field>
    },
    "ec_point_formats (11)": {
      "formats": [uncompressed]
    },
    "extended_master_secret (23)": {
      <empty>
    }
  ]
}
)

 

๐Ÿš€ ๊ฒฐ๋ก 

API ํ˜ธ์ถœ์€ IBM JDK(JSSE2) ํ™˜๊ฒฝ์—์„œ SSL handshake ๋‹จ๊ณ„์—์„œ ์‹คํŒจํ•˜๋ฉฐ, ๋กœ๊ทธ์ƒ SSLv3 ๊ด€๋ จ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ ์ด๋Š” ์‹ค์ œ SSLv3 ์š”์ฒญ์ด ์•„๋‹ˆ๋ผ
IBMJSSE2์˜ ๋ณด์•ˆ ์ •์ฑ…์— ์˜ํ•ด legacy SSL ํŠน์„ฑ์ด ํฌํ•จ๋œ handshake ํ๋ฆ„์ด  SSLv3 ๊ฒฝ๋กœ๋กœ ํŒ๋‹จ๋˜์–ด ์ฐจ๋‹จ๋œ ๋™์ž‘์ด๋‹ค.

๋™์ผ ์š”์ฒญ์ด Oracle JDK ํ™˜๊ฒฝ์—์„œ๋Š” TLSv1.2๋กœ ์ •์ƒ ์ฒ˜๋ฆฌ๋˜๋Š” ์ ์—์„œ, ์„œ๋ฒ„ ๋˜๋Š” ์ค‘๊ฐ„ SSL ์žฅ๋น„์˜ legacy SSL ๊ตฌํ˜„๊ณผ JDK๋ณ„ SSL ์Šคํƒ ์ฐจ์ด์— ๋”ฐ๋ฅธ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

=> ์ด ๊ฒฝ์šฐ API ์„œ๋ฒ„ ์ธก์—์„œ TLSv1.2 ์ด์ƒ์œผ๋กœ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก SSL/TLS ์„ค์ • ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

๐ŸŒŸํ™˜๊ฒฝ ๋น„๊ต

โœ” Oracle JDK (๋กœ์ปฌ)

  • ClientHello: TLSv1.2
  • ServerHello: TLSv1.2
  • legacy SSL ์‘๋‹ต์ด ์žˆ์–ด๋„
    TLSv1.2 ๊ฒฝ๋กœ๋กœ ์ •์ƒ ํ˜‘์ƒ ์ง„ํ–‰
  • ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธํ™˜์„ฑ ์ฒ˜๋ฆฌ(fallback/์šฐํšŒ)๊ฐ€ ํ—ˆ์šฉ๋จ

 

โŒ IBM JDK (๊ฐœ๋ฐœ ์„œ๋ฒ„)

  • SSL ๊ตฌํ˜„์ฒด: IBMJSSE2
  • legacy SSL ํŠน์„ฑ์ด ๊ฐ์ง€๋˜๋Š” handshake ํ๋ฆ„ ๋ฐœ์ƒ ์‹œ

→  SLv3 ๊ด€๋ จ ๊ฒฝ๋กœ๋กœ ๋ถ„๊ธฐ 

→  ๋ณด์•ˆ ์ •์ฑ…์ƒ ์ฆ‰์‹œ ์ฐจ๋‹จ

  • โŒ fallback / ์šฐํšŒ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

 

๐ŸŒŸ์—๋Ÿฌ ์ „ํŒŒ ํ๋ฆ„

[API ์„œ๋ฒ„]
   SSL handshake ๊ณผ์ •์—์„œ legacy SSL ๊ตฌํ˜„ ๊ธฐ๋ฐ˜ ์‘๋‹ต ์ „๋‹ฌ
        ↓
[IBM JDK SSL ์—”์ง„ (JSSE2)]
   SSLv3 ๊ด€๋ จ protocol ๊ฒฝ๋กœ๋กœ ๋ถ„๊ธฐ ์‹œ๋„
   → ๋ณด์•ˆ ์ •์ฑ…์ƒ ํ•ด๋‹น ๊ฒฝ๋กœ ์ฆ‰์‹œ ์ฐจ๋‹จ
        ↓
[JSSE]
   SSL handshake ์ค‘๋‹จ
        ↓
[OS socket layer]
   ์†Œ์ผ“ ์ดˆ๊ธฐํ™” ์‹คํŒจ → "invalid parameter" ๋ฐ˜ํ™˜
        ↓
[java.net.SocketException]
        ↓
[Spring ResourceAccessException]