Tải bản đầy đủ (.pdf) (72 trang)

TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL (Luận Văn Thạc Sĩ)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (607.45 KB, 72 trang )

i

Viện Công Nghệ Thông Tin Và Truyền Thông
ĐẠI HỌC BÁCH KHOA HÀ NỘI

Luận Văn Thạc Sĩ
TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ
THƯ VIỆN OPENSSL

Nguyen Thanh Long

Ha Noi, 2023


ii
MỤC LỤC
LỜI CẢM ƠN ................................................................................................. i
LỜI CAM ĐOAN .......................................................................................... ii
MỤC LỤC .................................................................................................... iii
CÁC KÝ HIỆU, CHỮ VIẾT TẮT ................................................................ vi
MỞ ĐẦU ....................................................................................................... 1
CHƯƠNG 1: TỔNG QUAN VỀ OPENSSL .................................................. 3
1.1. Lịch sử phát triển .................................................................................... 3
1.2. Các thành phần của OpenSSL................................................................. 4
1.2.1. Tính năng mã hóa ............................................................................. 4
1.2.2. Truyền thơng an toàn ........................................................................ 5
1.3. Một số ứng dụng của OpenSSL .............................................................. 6
1.3.1. Tạo kết nối SSL/TLS ........................................................................ 6
1.3.2. Mã hóa/giải mã dữ liệu ..................................................................... 6
1.3.3. Kiểm tra tính tồn vẹn dữ liệu .......................................................... 8
1.3.4. Các thao tác với chứng chỉ số ........................................................... 9


1.3.5. Một số ứng dụng khác của OpenSSL .............................................. 12
1.4. Lỗ hổng bảo mật OpenSSL................................................................... 14
1.4.1. Một số tấn công lên giao thức SSL/TLS ......................................... 14
1.4.2. Một số lỗ hổng bảo mật trong OpenSSL ......................................... 15
1.4.3. Lỗ hổng Heartbleed ........................................................................ 20
1.5. Kết luận chương ................................................................................... 22


iii
CHƯƠNG 2: CẤU TRÚC THƯ VIỆN MẬT MÃ VÀ PHƯƠNG PHÁP TÙY
BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL ........... 23
2.1. Cấu trúc thư viện mật mã của OpenSSL ................................................. 23
2.1.1. Thư viện CRYPTO.......................................................................... 23
2.1.2. Thư viện EVP ................................................................................. 24
2.1.3. Thư viện ERR ................................................................................. 29
2.1.4. Thư viện BIO .................................................................................. 33
2.1.5. Thư viện RAND .............................................................................. 37
2.1.6. Thư viện SSL .................................................................................. 38
2.2. Phương pháp tùy biến thuật toán mã khối cho bộ thư viện OpenSSL ....... 45
2.2.1. Tùy chọn thuật tốn mã khối sử dụng tiện ích ./config .................... 45
2.2.2. Thêm thuật toán mã khối bằng cách chỉnh sửa mã nguồn................ 48
2.3. Kết luận chương ..................................................................................... 49
CHƯƠNG 3: THỰC HIỆN TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ
THƯ VIỆN OPENSSL ................................................................................. 50
3.1. Sửa đổi thư mục crypto ......................................................................... 50
3.2. Thay đổi file cấu hình ........................................................................... 52
3.2.1. Thêm indect vào file config ............................................................ 52
3.2.2. Thêm indect vào file Configure ...................................................... 52
3.3. Tích hợp giao diện EVP........................................................................ 53
3.3.1. Cấu trúc khóa (Key Structure) ........................................................ 54

3.3.2. Cấu trúc EVP_CIPHER .................................................................. 54


iv
3.3.3. Đặt tên cho EVP_CIPHER ............................................................. 54
3.3.4. Hàm khởi tạo khóa ......................................................................... 55
3.3.5. Hàm khởi tạo mã hóa ...................................................................... 56
3.4. Sửa đổi với Crypto Objects................................................................... 58
3.5. Cập nhật evp.h ...................................................................................... 59
3.6. Tích hợp mã khối indect vào giao thức TLS ......................................... 59
3.6.1. Sửa đổi trong tls1.h ......................................................................... 59
3.6.2. Sửa đổi trong ssl.h .......................................................................... 60
3.6.3. Sửa đổi trong s3_lib.c ..................................................................... 60
3.6.4. Sửa đổi trong ssl_ciph.c .................................................................. 61
3.6.5. Sửa đổi trong ssl/ssl_init.c .............................................................. 63
3.6.6. Sửa đổi trong ssl/ssl_locl.h ............................................................. 63
3.7. Biên dịch và cài đặt .............................................................................. 63
3.8. Thử nghiệm mã hóa/giải mã file ........................................................... 63
3.9. Kết luận chương ................................................................................... 65
KẾT LUẬN .................................................................................................. 66
TÀI LIỆU THAM KHẢO ............................................................................ 67


v
CÁC KÝ HIỆU, CHỮ VIẾT TẮT
Viết tắt

Tiếng Anh

Tiếng Việt

Giao diện lập trình ứng
dụng

API

Application
Programming Interface

CVE

Common Vulnerabilities Lỗ hổng và tiếp xúc
and Exposures
thường gặp

MAC

Message Authentication
Code

Mã xác thực thông báo

SSL

Secure Sockets Layer

Giao thức bảo mật Web

TLS

Transport

Security

Bảo mật tầng truyền tải

Layer


1
MỞ ĐẦU
Sự phát triển mạnh mẽ của công nghệ thông tin và viễn thông đã tạo ra
nhiều bước đột phá về khoa học công nghệ với việc truyền tải thông tin ở các
loại hình khác nhau. Đặc biệt là sự phát triển mạnh mẽ của Internet làm cho
việc trao đổi và truyền tải thông tin vô cùng tiện lợi. Tuy nhiên việc truyền tải
thông tin qua mạng công cộng như vậy đã đặt ra yêu cầu xác thực, bảo mật và
tồn vẹn dữ liệu. Giải pháp được sử dụng đó là sử dụng kỹ thuật mật mã để
mã hóa bảo vệ thông tin.
Việc tùy biến các nguyên thủy mật mã trong đó có thuật tốn mã khối
cho bộ thư viện OpenSSL là cần thiết để nâng cao độ an toàn cho bộ thư viện.
Nội dụng của đồ án được chia làm 3 chương:
Chương 1: Tổng quan về OpenSSL
Chương này tr ình bày khái quát về OpenSSL bao gồm: lịch sử phát
triển, những ứng dụng và một số lỗ hổng bảo mật của OpenSSL.


2
Chương 2: Cấu trúc thư viện mật mã và phương pháp tùy biến thuật
toán mã khối cho bộ thư viện OpenSSL
Chương này trình bày cấu trúc thư viện mật mã của OpenSSL từ đó
đưa ra phương pháp tùy biến thuật toán mã khối cho thư viện.
Chương 3: Thực hiện tùy biến thuật toán mã khối cho bộ thư viện

OpenSSL
Trong chương này trình bày cụ thể các thay đổi mã nguồn của
OpenSSL để thêm một thuật toán mã khối INDECT vào thư viện sau đó mã
hóa/giải mã thử bằng mã khối INDECT.


3

CHƯƠNG 1: TỔNG QUAN VỀ OPENSSL
1.1.

Lịch sử phát triển
OpenSSL là một bộ công cụ mã nguồn mở, thực hiện các giao thức SSL

và TLS, cũng như các thuật toán mã hóa quan trọng thường được sử dụng trong
các chương trình ngày nay. OpenSSL được viết bằng ngơn ngữ lập trình C và
phát triển dựa trên SSLeay. SSLeay ban đầu được viết bởi Eric A. Young và
Tim J. Hudson bắt đầu vào năm 1995. Vào tháng 12 năm 1998, sự phát triển
của SSLeay đã dừng lại, phiên bản đầu tiên của OpenSSL được phát hành là
0.9.1c, sử dụng SSLeay 0.9.1b (chưa được phát hành) như là điểm khởi đầu của
nó.
Đến nay OpenSSL đã phát hành rất nhiều phiên bản, với mục đích để
hồn thiện hơn các phiên bản OpenSSL mới được nhà phát triển vá các lỗ
hổng của phiên bản trước đó và có thể tích hợp thêm các chức năng, thuật
tốn mật mã mạnh chưa được tích hợp ở các phiên bản cũ.
Hầu hết các bản phân phối OpenSSL có sẵn cho hầu hết các hệ điều
hành, bao gồm các hệ điều hành Unix, Windows và MacOS và có thể tải
xuống dưới dạng nguồn từ Thư viện chia sẻ
OpenSSL được cài đặt sẵn trong nhiều bản phân phối Linux.
Một số phiên bản phát hành:

Phiên bản
1.0.0
1.0.1
1.0.2
1.1.0
1.1.0g
1.1.1-pre6

Ngày phát hành
29/03/2010
14/03/2012
22/01/2015
25/08/2016
02/10/2017
01/05/2018


4

1.2.

Các thành phần của OpenSSL
OpenSSL bao gồm ba thành phần chính: thư viện (libcrypto và libssl) và

cơng cụ dịng lệnh (openssl). Thư viện mật mã cung cấp các thuật toán phổ
biến nhất cho mật mã đối xứng và mật mã khố cơng khai, các thuật tốn hàm
băm và mã xác thực thơng báo. Nó cũng cung cấp một máy phát số giả ngẫu
nhiên và hỗ trợ thao tác các định dạng chứng chỉ thơng thường và quản lý
khóa. Thư viện SSL cung cấp triển khai tất cả các phiên bản của giao thức
SSL, bao gồm TLSv1. Cơng cụ dịng lệnh để thực hiện một loạt các nhiệm vụ

mã hóa, chẳng hạn như tạo, xử lý các chứng chỉ và các tệp liên quan.
1.2.1. Tính năng mã hóa
Thư viện crypto thực hiện một loạt các hàm liên quan đến mật mã, bao
gồm: mật mã đối xứng, mật mã khóa cơng khai, xử lý chứng chỉ và hàm băm.
OpenSSL hỗ trợ rất nhiều thuật toán mật mã đối xứng. Tất nhiên, các
mã này cũng có sẵn để sử dụng với cơng cụ dòng lệnh. Nhiều trong số rất
nhiều mật mã là các biến thể của một mật mã cơ sở. Các mật mã cơ bản được
hỗ trợ bởi cơng cụ dịng lệnh là Blowfish, CAST5, DES, 3DES (Triple DES),
IDEA, RC2, RC4 và RC5. Các phiên bản mới của OpenSSL bổ sung hỗ trợ
cho AES, CAMELLIA, ARIA,....
Hầu hết các thuật toán mã đối xứng được hỗ trợ hỗ trợ nhiều chế độ
khác nhau, bao gồm CBC, CFB, ECB và OFB. Đối với mỗi mật mã, chế độ
mặc định luôn là CBC nếu một chế độ không được chỉ định rõ ràng.
Thư viện crypto cung cấp API cho phép các mật mã này được sử dụng
để mã hóa hoặc giải mã dữ liệu trong các ứng dụng bằng cách sử dụng thư
viện. Hơn nữa, các cơng cụ dịng lệnh openssl có thể mã hóa hoặc giải mã các
tệp tin có trọng số, sử dụng các khóa hoặc khóa được cung cấp dựa trên mật
khẩu.


5
1.2.2. Truyền thơng an tồn
Bộ cơng cụ OpenSSL cung cấp một số tính năng hữu ích trong việc
cung cấp giao tiếp an toàn qua Internet. Thư viện ssl thực hiện các giao thức
Secure Sockets Layer (SSL v2/v3) và Transport Layer Security (TLS v1).
Thư viện có thể được sử dụng bởi các nhà phát triển để đảm bảo các ứng dụng
của bên thứ ba. Một trong những ứng dụng như vậy là OpenVPN.
SSL (Secure Sockets Layer) và người kế nhiệm của nó, TLS (Transport
Layer Security) là các giao thức mạng cung cấp giao tiếp an tồn qua Internet.
SSL/TLS tích hợp các chức năng mã hóa dữ liệu, cho phép các ứng dụng máy

khách/máy chủ bảo vệ chống lại nghe lén và giả mạo.
SSL/TLS thường được triển khai ở trên cùng của một số giao thức
truyền tải, ví dụ: Giao thức điều khiển truyền dẫn (TCP). Nó đóng gói dữ liệu
ứng dụng. Một lợi thế lớn của SSL/TLS là nó là giao thức ứng dụng độc lập.
Giao thức cấp cao hơn có thể xếp chồng lên trên giao thức SSL/TLS một cách
minh bạch.
SSL và TLS sử dụng mật mã đối xứng (ví dụ: AES) để mã hóa dữ liệu.
Các khóa cho các mật mã này được tạo duy nhất cho mỗi kết nối và dựa trên
một bí mật được thương lượng bởi Giao thức bắt tay. SSL/TLS hỗ trợ kết hợp
nhiều mật mã, cơ chế xác thực và thuật toán băm. Các kết hợp này được gọi là
„Ciphersuites‟. Ciphersuites được chọn trong quá trình đàm phán.
Thư viện ssl thực hiện xử lý giao thức SSL và TLS. Thư viện có thể
được các ứng dụng của bên thứ ba sử dụng để bảo mật các kết nối bằng giao
thức SSL/TLS. Libssl cung cấp một API phong phú. Nhà phát triển có thể tạo
ứng dụng máy chủ hoặc ứng dụng khách bằng các chức năng của thư viện.


6
Thư viện ssl sử dụng các hàm mật mã do thư viện crypto cung cấp. Đặc
biệt, nó sử dụng mật mã đối xứng để mã hóa dữ liệu được truyền trong các kết
nối SSL/TLS.
1.3.

Một số ứng dụng của OpenSSL
OpenSSL phổ biến vì những tính năng mà nó cung cấp và hồn tồn

miễn phí. Cơ bản chủ yếu OpenSSL được sử dụng để tạo các kết nối
SSL/TLS trên Internet và các thực hiện các thuật tốn mật mã với nhiều mục
đích. Dưới đây sẽ là một số ứng dụng phổ biến của OpenSSL.
1.3.1. Tạo kết nối SSL/TLS

SSL là nền tảng chuẩn của giao thức bảo mật HTTPS (do Công ty
Netscape đề xuất vào năm 1994), giúp chuyển đổi tên người dùng dịch vụ và
mật khẩu tương ứng thành dạng mật mã. Nhờ vậy, trong thao tác đăng nhập
dịch vụ trên mạng, tên người dùng và mật khẩu không bị lộ khi truyền qua rất
nhiều máy tính trung gian trên đường đi. Mỗi lần nhận được tên người dùng và
mật khẩu, máy chủ dùng một chìa khóa bí mật (private key) để giải mật mã.
Theo lý thuyết, giải mật mã khi không có chìa khóa bí mật là điều khơng thể.
Tuyệt đối không thể!
Khi người dùng thiết lập một kết nối được mã hóa đến một trang web,
dù đó là Google, Facebook hay ngân hàng trực tuyến, dữ liệu sẽ được mã hóa
bằng giao thức SSL/TLS. Trong khi các phần mềm SSL thương mại rất đắt,
nhiều máy chủ web phổ biến sử dụng thư viện mã nguồn mở OpenSSL để
thực hiện công việc này (khoảng 60%).
1.3.2. Mã hóa/giải mã dữ liệu

Mã hóa là quá trình lấy dữ liệu (thường được gọi là bản rõ) và
chuyển đổi nó sang dạng thay thế (thường được gọi là bản mã) không


7

thể phân biệt được với bản gốc. Quá trình mã hóa dữ liệu thường yêu
cầu một khóa, và sử dụng một tập hợp các thuật toán để chuyển đổi dữ
liệu văn bản thơ thành bản mã.
Thuật tốn khóa đối xứng (cịn được gọi là thuật tốn bí mật được
chia sẻ) sử dụng cùng một khóa để mã hóa và giải mã dữ liệu. Thuật
tốn khóa cơng khai (cịn được gọi là thuật tốn bất đối xứng) sử dụng
các khóa khác nhau để mã hóa và giải mã. Thuật tốn khóa công khai
được đặt tên từ thực tế là một trong các khóa (khóa cơng khai) có thể
được phân phối cho người khác và dữ liệu được mã hóa bằng khóa nàychỉ

có thể được giải mã bằng khóa cá nhân được liên kết.
OpenSSL hỗ trợ một số thuật tốn khóa đối xứng, bao gồm: DES,
3DES, IDEA, Blowfish và AES. Mỗi thuật tốn khóa đối xứng có thể
được gọi bằng cách chuyển tên thuật toán tới lệnh enc, hoặc truyền trực
tiếp đến lệnh openssl. Ví dụ sau mã hóa tệp có tên passwd bằng thuật
toán Blowfish:
$ openssl bf -e -in /etc/secure/passwd -out
/etc/secure/passwd.enc.bf
enter bf-cbc encryption password:
Verifying - enter bf-cbc encryption password:
$ openssl enc -e -3des -in
/etc/secure/sensitive_data -out
/etc/secure/sensitive_data.enc.3des
enter bf-cbc encryption password:
Verifying - enter bf-cbc encryption password:


8
1.3.3. Kiểm tra tính tồn vẹn dữ liệu
Internet được sử dụng ngày càng nhiều để phân phối mã nguồn và gói
phần mềm nhị phân. Khi một trong các máy chủ phân phối phần mềm bị xâm
phạm, tính tồn vẹn của các gói phần mềm được đưa vào câu hỏi. Để đảm bảo
rằng phần mềm đã không bị giả mạo, một giá trị băm thơng báo có thể được
sử dụng để tạo ra một dấu vân tay kỹ thuật số của một tập tin. Giá trị băm
thông báo tạo ra bằng cách lấy tệp có độ dài thay đổi và chạy tệp thơng qua
thuật tốn băm để tạo ra đầu ra có độ dài cố định (dấu vân tay kỹ thuật
số). Thao tác này rất dễ thực hiện, nhưng việc đảo ngược thao tác là vơ cùng
khó khăn. Khi một dấu vân tay đã được tính tốn, nó có thể được phân phối
cho khách hàng thơng qua một kênh an tồn, và được sử dụng để đảm bảo
rằng nội dung của một tập tin không thay đổi.

OpenSSL hỗ trợ một số thuật tốn băm thơng báo, bao gồm các hàm
băm: MD2, MD4, MD5, SHA, SHA1, MDC2 và Ripe MD160. Mỗi thuật
toán có thể được gọi bằng cách chuyển tên thuật tốn đến lệnh dgst hoặc
truyền trực tiếp đến lệnh openssl. Ví dụ sau sử dụng tùy chọn dgst để tính
tốn thơng báo MD5 của /etc/secure/data:
$ openssl dgst -md5 /etc/secure/data
MD5(/etc/secure/data)=
f268fc3e92ef844117365a3368b8fe45
Ví dụ sau đây chuyển trực tiếp thuật toán digest tới openssl và tạo một
checksum MD5 của /etc/secure/data:
$ openssl md5 /etc/secure/data
MD5(/etc/secure/data)=
f268fc3e92ef844117365a3368b8fe45


9
Lệnh này sẽ tạo một giá trị băm MD5 của tất cả các tệp trong thư mục
/etc. Nếu cần kiểm tra xem một tệp trong /etc đã được sửa đổi chưa, có thể so
sánh giá trị băm hiện tại với giá trị băm được tính ở trên. Tệp chứa giá trị băm
phải được sao chép sang phương tiện chỉ đọc và được lưu trữ ở một vị trí an
tồn.
1.3.4. Các thao tác với chứng chỉ số

Chứng chỉ số là "giấy phép lái xe" điện tử được sử dụng để chứng
minh danh tính của khách hàng hoặc máy chủ. Tổ chức phát hành chứng
chỉ (CA) chịu trách nhiệm cấp chứng chỉ kỹ thuật số và chứng minh
danh tính của pháp nhân yêu cầu chứng chỉ. Chứng chỉ số chứa một số
thông tin, bao gồm: phiên bản chứng chỉ, số sê-ri để nhận dạng duy nhất
chứng chỉ, thuộc tính (Tổ chức phát hành) để xác định tổ chức đã cấp
chứng chỉ, phạm vi ngày chứng chỉ hợp lệ, thuộc tính (Chủ đề ) để xác

định trang web chứng chỉ đã được cấp cho, và chữ ký số. Chữ ký điện tử
được sử dụng bởi khách hàng và máy chủ để đảm bảo rằng cá nhân được
đại diện bởi chứng chỉ thực sự là những người mà họ cho biết.
1.3.4.1. Tạo một chứng chỉ

Khi một tổ chức muốn yêu cầu chứng chỉ số từ cơ quan cấp chứng
chỉ, họ sẽ cần gửi yêu cầu ký chứng chỉ (CSR). Yêu cầu ký chứng chỉ
chứa khóa cơng khai, tên thường gọi (ví dụ: www.example.com) để nhận
dạng duy nhất trang web và thông tin địa phương để xác định tổ chức. Ví
dụ sau cho thấy cách tạo yêu cầu ký chứng chỉ:
$ openssl req -new -outform PEM -keyform PEM -keyout
secret.key -out cert.csr -newkey rsa:1024


10

Trong q trình tạo u cầu, hai khóa RSA 1024 bit được tạo và các
phần thông tin khác nhau được thu thập. Tiện ích OpenSSL sẽ nhắc mật
mã, được sử dụng để mã hóa nội dung của khóa riêng. Khi các khóa
được tạo, khóa riêng sẽ được mã hóa PEM và được đặt trong tệp
secret.key. Yêu cầu ký chứng chỉ được đặt trong tệp cert.csr. Tệp này
chứa khóa cơng khai, thông tin địa phương và tên chung để nhận dạng
duy nhất trang web. Có thể in nội dung của yêu cầu ký chứng chỉ bằng
lệnh req:
$ openssl -req -in cert.csr -text

Khi đã xác minh yêu cầu ký chứng chỉ, có thể gửi nội dung đến Tổ
chức phát hành chứng chỉ yêu thích. Cơ quan cấp chứng chỉ sẽ sử dụng
nội dung của tệp này cùng với khóa riêng của họ để tạo chữ ký điện
tử. Tổ chức phát hành chứng chỉ cũng sẽ chỉ định ngày hết hạn và kết

hợp các thuộc tính bổ sung để xác định duy nhất tổ chức phát hành
chứng chỉ.
1.3.4.2. Hiển thị nội dung chứng chỉ

Chứng chỉ số có thể được lưu trữ ở nhiều định dạng. Hai trong số
các định dạng phổ biến nhất là PEM (Privacy Enhanced Mail) và DER
(Definite Encoding Rules). OpenSSL có thể in nội dung của cả hai định
dạng chứng chỉ bằng lệnh x509. Ví dụ sau sẽ in nội dung của chứng chỉ
được mã hóa PEM cert.crt.pem:
$ openssl x509 -in cert.crt.pem -inform PEM -text noout


11

OpenSSL cũng cho phép in các thuộc tính riêng lẻ của một chứng
chỉ:
$ openssl x509 -in cert.crt.der -inform PEM -noout enddate

Với thuộc tính -enddate câu lệnh trên sẽ chỉ in dữ liệu ngày hết
hạn của chứng chỉ cert.crt.der.
1.3.4.2. Chuyển đổi giữa các loại chứng chỉ

Chứng chỉ kỹ thuật số có thể được lưu trữ ở nhiều định dạng khác
nhau. Điều này có thể gây ra sự cố khi chứng chỉ cần được di chuyển
giữa các máy chủ web không đồng nhất hoặc được phân phối giữa các
thành phần ứng dụng. OpenSSL cung cấp tùy chọn x509 để chuyển đổi
giữa các chứng chỉ được mã hóa PEM và DER. Ví dụ sau sẽ chuyển đổi
chứng chỉ được mã hóa PEM sang định dạng DER:
$ openssl x509 -in cert.crt.pem -inform PEM -out
cert.crt.der -outform DER


Khi chứng chỉ đã được chuyển đổi, nó sẽ được đặt trong tệp
cert.der.crt. Ví dụ sau chuyển đổi chứng chỉ được định dạng DER sang
định dạng PEM:
$ openssl x509 -in cert.crt.der -inform DER -out
cert.crt.pem -outform PEM

Lệnh OpenSSL pkcs12 có thể được sử dụng để nhập và xuất các
chứng chỉ được lưu trữ trong cơ sở dữ liệu PKCS#12. Ví dụ sau sẽ xuất
chứng chỉ với bí danh Server-Cert từ cơ sở dữ liệu PKCS#12:


12

$ openssl pkcs12 -export Server-Cert -in
cert.db.pkcs12 -out cert.crt.p12

Khi chứng chỉ đã được xuất, nó có thể được chuyển thành định
dạng PEM hoặc DER với lệnh pkcs12:
$ openssl pkcs12 -in cert.crt.p12 -out cert.crt.pem
1.3.5. Một số ứng dụng khác của OpenSSL
1.3.5.1. Tạo số hoặc chuỗi ngẫu nhiên
Để tạo chuỗi ngẫu nhiên, ta có thể sử dụng lệnh OpenSSL. Ví dụ có
thể sử dụng lệnh sau để tạo một số ngẫu nhiên:
$echo $ (openssl rand 4 | od –Dan)
1173091498
Nếu muốn tạo ra một chuỗi base64 ngẫu nhiên sử dụng lệnh:
$openssl rand –base64 6
Cki3awd4
OpenSSL cũng có thể sinh một tập hợp các số nguyên tố và kiểm tra số

nguyên tố.
$openssl prime –generate –bits 64
161488910401035823
$openssl prime –generate –bits 64 –hex
E207F23B9AE52191
$openssl prime 119054759245460753
1A6F7AC39A53511 is not prime


13
1.3.5.2. Đánh giá hiệu suất của hệ thống
Các nhà phát triển OpenSSL đã xây dựng một bộ tiêu chuẩn trực tiếp
vào OpenSSL nhị phân. Nó có thể truy cập thơng qua tùy chọn speed. Thay vì
phải mất bao lâu để thực hiện một số hoạt động nhất định, nó kiểm tra bao
nhiêu hoạt động nó có thể thực hiện trong một thời gian nhất định. Như vậy
điểm chuẩn không mất nhiều thời gian hơn để chạy trên một hệ thống chậm
hơn so với hệ thống có tốc độ nhanh.
Sử dụng câu lệnh:
$ openssl speed
Có hai bộ kết quả. Các báo cáo đầu tiên có thể xử lý bao nhiêu byte
mỗi giây cho mỗi thuật toán, thứ hai là thời gian cần thiết cho các chu kỳ
ký/xác minh.
The 'numbers' are in 1000s of bytes per second processed.
type

16 bytes

64 bytes

aes-256 ige


94382.07k

96351.17k

sign
rsa

512 bits 0.000049s 0.000004s
sign

dsa

verify

verify

512 bits 0.000048s 0.000046s

256 bit ecdsa (nistp256)

96750.68k

96958.46k

8192 bytes
97446.44k

20547.1 248266.2
sign/s verify/s

20667.7

21701.8

verify

0.0001s

0.0004s

0.0003s

1024 bytes

sign/s verify/s

sign

op
256 bit ecdh (nistp256)

256 bytes

sign/s verify/s
9856.1

2524.4

op/s
3063.8


Và có thể kiểm tra tốc độ của một thuật toán bất kỳ bằng câu lệnh
$ openssl speed rsa


14

1.4.

Lỗ hổng bảo mật OpenSSL
Trong khi đã có lỗ hổng bảo mật liên tục trong openSSL, một số trong

những vấn đề này đã gây ra thiệt hại đáng kể cho khách hàng và máy chủ. Tổ
chức OpenSSL đã cung cấp các bản vá liên tục để xử lý các vấn đề như vậy.
1.4.1. Một số tấn công lên giao thức SSL/TLS
Các cuộc tấn công nghiêm trọng đối với openSSL được mô tả bởi tổ
chức openSSL như sau:
✓ Klima-Pokorny-Rosa tấn công RSA trong SSL/TLS (2003)
Các nhà mật mã học người Séc Vlastimil Klima, Ondrej Pokorny và
Tomas Rosa đã đưa ra một phần mở rộng của tấn công Bleichenbacher trên
RSA với padding PKCS#1 v1.5 như được sử dụng trong SSL 3.0 và TLS 1.0.
Cuộc tấn cơng của họ địi hỏi kẻ tấn công phải mở hàng triệu kết nối
SSL/TLS tới máy chủ đang bị tấn công; hành vi của máy chủ khi đối mặt với
các thuật toán RSA được thiết kế đặc biệt có thể tiết lộ thơng tin có hiệu lực
cho phép kẻ tấn cơng thực hiện một thao tác khóa riêng RSA trên một bản mã
do sự lựa chọn của nó bằng khóa RSA của máy chủ. Lưu ý rằng khóa RSA
của máy chủ khơng bị xâm phạm trong cuộc tấn công này.
✓ Các cuộc tấn công timing trên các khóa RSA (2003)
Các nhà nghiên cứu đã phát hiện ra một cuộc tấn cơng timing trên các
khóa RSA, mà OpenSSL nói chung là dễ bị tổn thương, trừ khi sự ràng buộc

RSA đã được bật lên. Thơng thường, nó sẽ khơng đạt được, bởi vì nó khơng
phải là dễ dàng có thể làm như vậy khi sử dụng OpenSSL để cung cấp SSL
hoặc TLS.


15
Tác động hiệu suất dường như là nhỏ (một vài phần trăm), tuy nhiên vấn
đề này ảnh hưởng đến nhiều ứng dụng sử dụng OpenSSL, đặc biệt là hầu như
tất cả các Apache đã kích hoạt SSL.
✓ Các cuộc tấn cơng timing trên SSL/TLS với mã hóa CBC (2003)
Cuộc tấn công giả định rằng nhiều kết nối SSL hoặc TLS liên quan đến
một khối văn bản cố định phổ biến, chẳng hạn như mật khẩu. Kẻ tấn cơng chủ
động có thể thay thế các khối mã hóa được tạo ra đặc biệt cho các khối được
gửi bởi các bên SSL/TLS hợp pháp và đo thời gian cho đến khi một phản hồi
đến: SSL/TLS bao gồm xác thực dữ liệu để đảm bảo rằng các khối mã hóa
được sửa đổi đó sẽ bị từ chối (và kết nối bị hủy bỏ), nhưng kẻ tấn cơng có thể
sử dụng các quan sát thời gian để phân biệt giữa hai trường hợp lỗi khác nhau,
cụ thể là các lỗi mã hóa khối và lỗi xác minh MAC. Điều này là đủ cho một
cuộc tấn cơng thích ứng mà cuối cùng có thể có được khối văn bản hoàn
chỉnh.
1.4.2. Một số lỗ hổng bảo mật trong OpenSSL
• CVE-2018-0737 [Mức độ nghiêm trọng thấp] (16/04/2018): Thuật tốn
tạo khóa RSA OpenSSL đã được chứng minh là dễ bị tấn công bởi bộ
đệm thời gian trong bộ nhớ cache. Kẻ tấn cơng có đủ quyền truy cập để
gắn kết các cuộc tấn công bộ nhớ cache trong q trình tạo khóa RSA
có thể khơi phục khóa riêng. Báo cáo của Alejandro Cabrera Aldaya,
Billy Brumley, Cesar Pereida Garcia và Luis Manuel Alvarez Tapia.
➢ Đã sửa trong OpenSSL 1.1.0i-dev (Bị ảnh hưởng 1.1.0-1.1.0h)
➢ Đã sửa lỗi trong OpenSSL 1.0.2p-dev (Bị ảnh hưởng 1.0.21.0.2o)
• CVE-2018-0739 [Mức độ nghiêm trọng trung bình] (27/03/ 2018): Các

kiểu cấu trúc ASN.1 được xây dựng với một định nghĩa đệ quy (như có


16
thể được tìm thấy trong PKCS7) cuối cùng có thể vượt quá đầu vào độc
hại của ngăn xếp với quá trình đệ quy q mức. Điều này có thể dẫn
đến một cuộc tấn cơng từ chối dịch vụ. Khơng có cấu trúc như vậy được
sử dụng trong SSL/TLS đến từ các nguồn không đáng tin cậy nên điều
này được coi là an toàn. Báo cáo bởi OSS-fuzz.
➢ Đã sửa trong OpenSSL 1.1.0h (Bị ảnh hưởng 1.1.0-1.1.0g)
➢ Đã sửa trong OpenSSL 1.0.2o (Bị ảnh hưởng 1.0.2b-1.0.2n)
• CVE-2018-0733 [Mức độ nghiêm trọng trung bình] (27/03/2018): Do
lỗi triển khai, chức năng PA-RISC CRYPTO_memcmp bị giảm hiệu
quả để chỉ so sánh bit quan trọng nhất của mỗi byte. Điều này cho phép
kẻ tấn công giả mạo các thư được coi là được xác thực trong một số lầnthử
thấp hơn mức được đảm bảo bởi các yêu cầu bảo mật của lược đồ. Môđun này chỉ có thể được biên dịch bởi HP-UX assembler, do đó chỉ các
đối tượng HP-UX PA-RISC mới bị ảnh hưởng. Báo cáo của Peter
Waltenberg (IBM).
➢ Đã sửa trong OpenSSL 1.1.0h (Bị ảnh hưởng 1.1.0-1.1.0g)
• CVE-2017-3738 [Mức độ nghiêm trọng thấp] (07/12/2017): Có lỗi tràn
trong quy trình nhân giống của AVX2 Montgomery được sử dụng trong
lũy thừa với mô-đun 1024 bit. Khơng có thuật tốn EC nào bị ảnh
hưởng. Phân tích cho thấy rằng các cuộc tấn công chống lại RSA và
DSA là kết quả của lỗi này sẽ rất khó thực hiện và khơng được cho là có
khả năng xảy ra. Các cuộc tấn công chống lại DH1024 được coi là khả
thi, bởi vì hầu hết cơng việc cần thiết để suy ra thơng tin về khóa riêng
có thể được thực hiện ngoại tuyến. Số lượng tài nguyên cần thiết cho
một cuộc tấn công như vậy sẽ là đáng kể. Tuy nhiên, đối với một cuộc
tấn cơng vào TLS có ý nghĩa, máy chủ sẽ phải chia sẻ khóa riêng
DH1024 giữa nhiều khách hàng, mà khơng cịn là một lựa chọn từ



17
CVE-2016-0701. Điều này chỉ ảnh hưởng đến các bộ vi xử lý hỗ trợ
AVX2 chứ không phải các phần mở rộng ADX như Intel Haswell (thế
hệ thứ 4). Lưu ý: Tác động từ vấn đề này tương tự như CVE-2017- 3736,
CVE-2017-3732 và CVE-2015-3193. Do mức độ nghiêm trọng thấp
của vấn đề này, nên OpenSSL không phát hành bản phát hành
OpenSSL 1.1.0 mới tại thời điểm này. Bản sửa lỗi được bao gồm trong
OpenSSL 1.1.0h khi nó có sẵn. Báo cáo bởi David Benjamin
(Google)/Google OSS-Fuzz.
➢ Đã sửa trong OpenSSL 1.1.0h (Bị ảnh hưởng 1.1.0-1.1.0g)
➢ Đã sửa trong OpenSSL 1.0.2n (Bị ảnh hưởng 1.0.2-1.0.2m)
• CVE-2017-3737 [Mức độ nghiêm trọng vừa phải] (07/12/2017):
OpenSSL 1.0.2 (bắt đầu từ phiên bản 1.0.2b) đã giới thiệu một cơ chế
"trạng thái lỗi". Mục đích là nếu một lỗi nghiêm trọng xảy ra trong một
cái bắt tay thì OpenSSL sẽ chuyển sang trạng thái lỗi và ngay lập tức sẽ
thất bại nếu cố gắng tiếp tục cái bắt tay. Điều này hoạt động như được
thiết kế cho các hàm bắt tay rõ ràng (SSL_do_handshake (),
SSL_accept () và SSL_connect ()), tuy nhiên do lỗi nó khơng hoạt động
chính xác nếu SSL_read () hoặc SSL_write () được gọi trực tiếp. Trong
trường hợp đó, nếu bắt tay khơng thành cơng thì một lỗi nghiêm trọng
sẽ được trả lại trong cuộc gọi hàm ban đầu. Nếu SSL_read ()/SSL_write
() sau đó được gọi bởi ứng dụng cho cùng một đối tượng SSL thì nó sẽ
thành cơng và dữ liệu được truyền mà khơng bị giải mã/mã hóa trực tiếp
từ lớp bản ghi SSL/TLS. Để khai thác vấn đề này, một lỗi ứng dụng sẽ
phải có mặt dẫn đến một cuộc gọi đến SSL_read ()/ SSL_write () được
phát hành sau khi đã nhận được một lỗi nghiêm trọng. Báo cáo bởi
David Benjamin (Google).
➢ Đã sửa trong OpenSSL 1.0.2n (Ảnh hưởng 1.0.2b-1.0.2m)



18
• CVE-2017-3736 [Mức độ nghiêm trọng vừa phải] (02/11/2017): Có
một lỗi lan truyền mang trong thủ tục bình phương x86_64
Montgomery. Khơng có thuật tốn EC nào bị ảnh hưởng. Phân tích cho
thấy rằng các cuộc tấn cơng chống lại RSA và DSA là kết quả của lỗi
này sẽ rất khó thực hiện và khơng được cho là có khả năng xảy ra. Các
cuộc tấn công chống lại DH được coi là khả thi (mặc dù rất khó) vì hầu
hết các công việc cần thiết để suy ra thông tin về khóa riêng có thể
được thực hiện ngoại tuyến. Số lượng tài nguyên cần thiết cho một cuộc
tấn công như vậy sẽ rất đáng kể và có khả năng chỉ truy cập được với
một số lượng hạn chế kẻ tấn công. Kẻ tấn công cũng cần truy cập trực
tuyến vào một hệ thống chưa được vá bằng cách sử dụng khóa riêng
mục tiêu trong một kịch bản với các tham số DH liên tục và khóa riêng
được chia sẻ giữa nhiều máy khách. Điều này chỉ ảnh hưởng đến các bộ
vi xử lý hỗ trợ các phần mở rộng BMI1, BMI2 và ADX như Intel
Broadwell (thế hệ thứ 5) và sau đó hoặc AMD Ryzen. Báo cáo bởi
Google OSS-Fuzz.
➢ Đã sửa trong OpenSSL 1.1.0g (Bị ảnh hưởng 1.1.0-1.1.0f)
➢ Đã sửa trong OpenSSL 1.0.2m (Bị ảnh hưởng 1.0.2-1.0.2l)
• CVE-2017-3735 [Mức độ nghiêm trọng thấp] (28/08/2017): Trong khi
phân tích cú pháp một phần mở rộng IPAdressFamily trong một chứng
chỉ X.509, nó có thể thực hiện đọc một byte. Điều này sẽ dẫn đến hiển
thị văn bản khơng chính xác của chứng chỉ. Báo cáo bởi Google OSSFuzz.
➢ Đã sửa trong OpenSSL 1.1.0g (Bị ảnh hưởng 1.1.0-1.1.0f)
➢ Đã sửa trong OpenSSL 1.0.2m (Bị ảnh hưởng 1.0.2-1.0.2l)
• CVE-2017-3733 [Mức độ nghiêm trọng cao] (16/02/2017): Trong quá
trình bắt tay tái đàm phán nếu phần mở rộng Encrypt-Then-Mac được



19
thương lượng khi nó khơng ở trong cái bắt tay ban đầu (hoặc ngược lại)thì
điều này có thể làm OpenSSL bị lỗi (phụ thuộc vào ciphersuite). Cả
khách hàng và máy chủ đều bị ảnh hưởng. Báo cáo bởi Joe Orton (Red
Hat).
➢ Đã sửa trong OpenSSL 1.1.0e (Bị ảnh hưởng 1.1.0-1.1.0d)
• CVE-2017-3732 [Mức độ nghiêm trọng vừa phải] (26/01/2017): Có
một lỗi lan truyền mang trong thủ tục bình phương x86_64
Montgomery. Khơng có thuật tốn EC nào bị ảnh hưởng. Phân tích cho
thấy rằng các cuộc tấn công chống lại RSA và DSA là kết quả của lỗi
này sẽ rất khó thực hiện và khơng được cho là có khả năng xảy ra. Các
cuộc tấn công chống lại DH được coi là khả thi (mặc dù rất khó) vì hầu
hết các cơng việc cần thiết để suy ra thơng tin về khóa riêng có thể
được thực hiện ngoại tuyến. Số lượng tài nguyên cần thiết cho một cuộc
tấn công như vậy sẽ rất đáng kể và có khả năng chỉ truy cập được với
một số lượng hạn chế kẻ tấn công. Kẻ tấn công cũng cần truy cập trực
tuyến vào một hệ thống chưa được vá bằng cách sử dụng khóa riêng
mục tiêu trong một kịch bản với các tham số DH liên tục và khóa riêng
được chia sẻ giữa nhiều máy khách. Ví dụ, điều này có thể xảy ra theo
mặc định trong các thuật tốn mã hóa SSL/TLS dựa trên OpenSSL
DHE. Lỗ hổng này rất giống với CVE-2015-3193 nhưng được coi làmột
vấn đề riêng biệt. Báo cáo bởi dự án OSS-Fuzz.
➢ Đã sửa trong OpenSSL 1.1.0d (Bị ảnh hưởng 1.1.0-1.1.0c)
➢ Đã sửa trong OpenSSL 1.0.2k (Bị ảnh hưởng 1.0.2-1.0.2j)
• CVE-2017-373 [Mức độ nghiêm trọng vừa phải] (26/01/2017): Nếu
máy chủ hoặc máy khách SSL/TLS đang chạy trên máy chủ 32 bit và
một mật mã cụ thể đang được sử dụng thì gói bị cắt bớt có thể khiến
máy chủ hoặc máy khách thực hiện đọc ngoài giới hạn, thường dẫn đến



20
sự cố . Đối với OpenSSL 1.1.0, sự cố có thể được kích hoạt khi sử dụng
CHACHA20/POLY1305; người dùng nên nâng cấp lên 1.1.0d. Đối với
Openssl 1.0.2, sự cố có thể được kích hoạt khi sử dụng RC4- MD5;
người dùng khơng tắt thuật tốn đó sẽ cập nhật lên 1.0.2k Báo cáo bởi
Robert Swiecki của Google.
➢ Đã sửa trong OpenSSL 1.1.0d (Bị ảnh hưởng 1.1.0-1.1.0c)
➢ Đã sửa trong OpenSSL 1.0.2k (Bị ảnh hưởng 1.0.2-1.0.2j)
• CVE-2017-3730 [Mức độ nghiêm trọng vừa phải] (26/01/2017): Nếu
một máy chủ độc hại cung cấp các thơng số xấu cho một trao đổi khóa
DHE hoặc ECDHE thì điều này có thể dẫn đến việc máy khách cố gắng
tham chiếu một con trỏ NULL dẫn đến một sự cố máy khách. Điều này
có thể được khai thác trong một cuộc tấn công từ chối dịch vụ. Báo cáo
của Guido Vranken.
➢ Đã sửa trong OpenSSL 1.1.0d (Bị ảnh hưởng 1.1.0-1.1.0c)
1.4.3. Lỗ hổng Heartbleed
Ngày 4/4/2014, tại Silicon Valley (Mỹ), David Chartier - giám đốc điều
hành của Công ty Codenomicon - nhận được cuộc gọi khẩn từ nhóm kỹ sư an
ninh mạng ở trụ sở Codenomicon tại Helsinki (Phần Lan), thông báo rằng đã
phát hiện một lỗi nghiêm trọng, cho phép đọc hầu như tồn bộ thơng tin trên
bộ nhớ của những máy chủ dùng phần mềm nguồn mở OpenSSL (Open
Secure Socket Layer), như máy chủ của Google, Facebook, Yahoo,... cùng
hàng triệu máy chủ khác (khoảng trên 60% số máy chủ của Internet). Hệ
thống máy chủ của Apple và Microsoft dùng công nghệ SSL riêng, không
dùng công nghệ nguồn mở OpenSSL.
Chartier hiểu ngay tầm vóc của vấn đề, nhưng để đánh giá chính xác
mức độ nghiêm trọng của lỗi bảo mật, ơng đề nghị nhóm an ninh mạng của
Codenomicon đóng vai kẻ xâm nhập, thử nghiệm khai thác lỗi bảo mật của



×