เชื่อมต่อ TLS Services ด้วย openssl s_client
Tags: openssl
Published: 2021-02-27 09:47:08

TLS (Transport Layer Security) เป็น protocol เพื่อทำให้การเชื่อมและการส่งผ่านข้อมูลนั้นถูกเข้ารหัสเพื่อความปลอดภัย ซึ่งปกติถ้าไม่ได้ใช้ TLS เราสามารถเชื่อมต่อ TCP ได้โดยใช้ program อย่าง nc หรือ telnet ทีนี้ถ้าเกิด server ใช้ TLS เราอยากทดสอบเชื่อมต่อแบบ telnet หรือ nc เราสามารถใช้ `openssl s_client` แทนได้ ตัวอย่างการใช้งานเช่น

```
> openssl s_client -connect httpbin.org:443
CONNECTED(00000006)
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = httpbin.org
verify return:1
---
Certificate chain
 0 s:/CN=httpbin.org
   i:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
 1 s:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
   i:/C=US/O=Amazon/CN=Amazon Root CA 1
 2 s:/C=US/O=Amazon/CN=Amazon Root CA 1
   i:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
 3 s:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
   i:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
subject=/CN=httpbin.org
issuer=/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 5494 bytes and written 322 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
....
Start Time: 1614418579
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
```

เราจะเห็น log การเชื่อมต่อของ TLS เกิดขึ้น เรื่องการ handshake ต่างๆ ให้เราเห็นด้วย

จากนั้นจะขึ้น `---` หลังจากนี้ก็พร้อมให้เราส่ง message ตาม protocol HTTP ต่อจากนั้นได้เลยเช่น

```
GET /get HTTP/1.0
Content-Type: application/json
Accept: application/json

```

ก็จะได้ response กลับออกมาแบบนี้

```
GET /get HTTP/1.0
Content-Type: application/json
Accept: application/json

HTTP/1.1 200 OK
Date: Sat, 27 Feb 2021 09:44:22 GMT
Content-Type: application/json
Content-Length: 392
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

{
  "args": {}, 
  "headers": {
    "Accept": "application/json", 
    "Content-Type": "application/json", 
    "Host": "a0207c42-pmhttpbin-pmhttpb-c018-592832243.us-east-1.elb.amazonaws.com", 
    "X-Amzn-Trace-Id": "Root=1-603a1476-74ca54983e04bc07559eb7dc"
  }, 
  "origin": "159.192.223.20", 
  "url": "https://a0207c42-pmhttpbin-pmhttpb-c018-592832243.us-east-1.elb.amazonaws.com/get"
}
closed
```

จะเห็นว่า openssl s_client มีประโยชน์มากๆ ในการที่จะช่วยเรา debug การทำงานของ TLS และทดสอบส่ง request ไปหา server ที่ใช้ TLS ด้วยนั่นเอง


## ขอฝาก Buy Me a Coffee
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ

<a href="https://www.buymeacoffee.com/weerasak" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>

ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth

ขอบคุณครับ 🙏