# Lỗi SSL với Curl ( Unsafe legacy renegotiation )

Dưới đây là bài viết blog tổng hợp về lỗi `unsafe legacy renegotiation` khi dùng `curl` với TLS, hướng tới chia sẻ cho cộng đồng kỹ thuật hoặc DevOps, SysAdmin:

***

### ⚠️ \[LỖI CURL] `unsafe legacy renegotiation disabled` – Nguyên nhân và cách khắc phục với OpenSSL 3

Khi làm việc với các hệ thống sử dụng TLS (HTTPS), bạn có thể gặp lỗi sau khi dùng `curl` để truy cập một API:

```
curl: (35) OpenSSL/3.0.x: error:0A000152:SSL routines::unsafe legacy renegotiation disabled
```

Lỗi này khiến bạn không thể kết nối tới server qua HTTPS, dù API vẫn hoạt động bình thường trên trình duyệt. Vậy chuyện gì đang xảy ra?

***

#### 🔍 Nguyên nhân: **Legacy TLS Renegotiation**

TLS "renegotiation" là quá trình client và server đàm phán lại phiên mã hóa giữa chừng. Nhưng trước năm 2010, cơ chế này có một lỗ hổng nghiêm trọng (CVE-2009-3555) cho phép **kẻ tấn công chèn dữ liệu vào phiên TLS** mà không bị phát hiện.

➡️ Để vá lỗ hổng, **RFC 5746** ra đời và định nghĩa lại cách thực hiện renegotiation một cách **an toàn**.

> ❗ Tuy nhiên, một số máy chủ cũ vẫn dùng cơ chế **legacy renegotiation**, không tương thích với chuẩn bảo mật hiện đại.

***

#### 🔐 OpenSSL 3.x: Không còn cho phép legacy renegotiation

Từ phiên bản **OpenSSL 3.0+**, **chế độ legacy renegotiation bị vô hiệu hóa mặc định** vì lý do bảo mật. Điều đó dẫn đến lỗi khi dùng:

```bash
curl https://your-api.example.com
```

***

#### 💡 Giải pháp tạm thời: Cho phép lại renegotiation **một cách có kiểm soát**

Bạn có thể bật lại renegotiation tạm thời bằng cách override cấu hình OpenSSL khi gọi `curl`:

**✅ Cách dùng:**

```bash
OPENSSL_CONF=<(echo -e '[default_conf]\nssl_conf = ssl_sect\n[ssl_sect]\nsystem_default = profile_sect\n[profile_sect]\nOptions = UnsafeLegacyRenegotiation\nMinProtocol = TLSv1.2\nMaxProtocol = TLSv1.2') \
curl --insecure https://your-api.example.com
```

**Giải thích:**

| Thành phần                            | Mục đích                          |
| ------------------------------------- | --------------------------------- |
| `Options = UnsafeLegacyRenegotiation` | Bật lại renegotiation cũ          |
| `Min/MaxProtocol = TLSv1.2`           | Ép chỉ dùng TLS 1.2               |
| `--insecure`                          | Bỏ qua xác thực chứng chỉ nếu cần |

> ⚠️ **Không dùng trong production hoặc hệ thống có dữ liệu nhạy cảm.** Chỉ dùng để debug/test tạm thời.

***

#### ✅ Giải pháp lâu dài: **Fix từ phía máy chủ**

Nếu bạn quản lý máy chủ (ngược lại là client), hãy đảm bảo:

* Phần mềm web server (Apache/nginx/Java/Tomcat) đã hỗ trợ **RFC 5746**
* Tắt hẳn renegotiation nếu không cần thiết:

  ```apache
  SSLInsecureRenegotiation off
  ```
* Nâng cấp phần mềm lên phiên bản mới hỗ trợ secure renegotiation (Apache ≥ 2.2.15, nginx ≥ 1.3...)

***

#### 🧪 Cách kiểm tra server có hỗ trợ RFC 5746 hay không

```bash
openssl s_client -connect your-api.example.com:443
```

Nếu kết quả có dòng:

```
Secure Renegotiation IS NOT supported
```

➡️ Máy chủ đang **không hỗ trợ RFC 5746**, cần nâng cấp hoặc cấu hình lại.

***

#### 🛠️ Trường hợp đặc biệt: Palo Alto, F5, HAProxy

* Nếu kết nối HTTPS đi qua thiết bị trung gian như **Palo Alto firewall**, bạn cần kiểm tra:
  * Phiên bản PAN-OS (>= 8.1 sẽ hỗ trợ RFC 5746)
  * Chính sách TLS/SSL profile trong cấu hình
* Tắt hoặc điều chỉnh các chính sách decryption nếu gây lỗi handshake

***

#### 📌 Kết luận

| Tình huống               | Cách xử lý                                                 |
| ------------------------ | ---------------------------------------------------------- |
| Là client gặp lỗi        | Bật lại `UnsafeLegacyRenegotiation` tạm thời như hướng dẫn |
| Là server quản lý        | Cập nhật phần mềm và bật RFC 5746                          |
| Dùng thiết bị trung gian | Kiểm tra SSL/TLS handling của thiết bị                     |

***

#### 📥 Tham khảo nhanh: Lệnh mẫu

```bash
OPENSSL_CONF=<(echo -e '[default_conf]\nssl_conf = ssl_sect\n[ssl_sect]\nsystem_default = profile_sect\n[profile_sect]\nOptions = UnsafeLegacyRenegotiation') \
curl --insecure https://your-api.example.com
```

***

#### 👨‍💻 Thực tế với your-api.example.com

* Server không hỗ trợ RFC 5746
* Bắt buộc phải dùng legacy renegotiation → gây lỗi với OpenSSL 3.x
* Chỉ có thể kết nối thành công bằng cách bật `UnsafeLegacyRenegotiation` tạm thời


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.micsoftvn.com/use-cases/for-sysadmin/loi-ssl-voi-curl-unsafe-legacy-renegotiation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
