Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Làm chủ kết nối SSL/TLS đến Redis Enterprise: Hướng dẫn cho nhà phát triển Java

Xây dựng phần mềm sử dụng kết nối an toàn đến máy chủ là một kỹ năng mà mọi nhà phát triển nên sở hữu. Dù bạn chọn không bật SSL trong một môi trường sản xuất cụ thể, bạn vẫn nên biết cách bảo mật kết nối đến mọi máy chủ mà bạn làm việc. Bài viết này là phần tiếp theo được hứa hẹn của bài Enabling Secure Connections to Redis Enterprise Cloud in Python dành cho các fan của Java.

Bài viết này hướng dẫn quy trình đơn giản để bật, kiểm tra và cấu hình kết nối mã hóa giữa Redis Enterprise Cloud và chương trình client Java sử dụng SSL. Phần gây nhầm lẫn nhất khi bật SSL cho chương trình Java là chuyển đổi chứng chỉ và khóa sang định dạng Java hiểu được. Đây là thủ tục chỉ dành cho Java mà chúng ta phải chèn giữa các bước kiểm tra và cấu hình của quy trình.

Bộ công cụ

Chuẩn bị các công cụ sau để hoàn thành việc bật SSL trên Redis:

  • Tài khoản Redis Enterprise Cloud
  • OpenSSL
  • Java SE JDK
  • Jedis

Bạn cũng cần cài đặt Bash shell để chạy script nhỏ chúng tôi cung cấp. Nếu hệ điều hành không có Bash sẵn, hãy cài đặt hoặc dịch script sang shell ưa thích.

Để sử dụng SSL, gói đăng ký Redis Enterprise Cloud phải bật tính năng SSL. Nếu tài khoản chưa bật, hãy liên hệ nhóm hỗ trợ Redis qua menu chính trên bảng điều khiển. Tài liệu thiết lập SSL có trong Redis Enterprise Cloud Operations and Administration Guide.

SSL và TLS

Nhắc lại: như bài Python, chúng ta dùng từ "SSL" để chỉ cả SSL và TLS. Dù Redis Enterprise Cloud (tháng 6/2018) dùng TLS 1.2, cả Redis Enterprise Cloud và Jedis đều dùng thuật ngữ "SSL", nên chúng ta làm theo.

Bước 1 và 2

Hai bước đầu giống hệt thiết lập SSL cho client Python. Thay vì lặp lại, chúng ta tham khảo bài Python. Khuyến nghị đọc hết phần trước Bước 3 trước khi tiếp tục.

Quy trình phân nhánh cho Java sau Bước 2, nên chèn Bước 2.5 để chuyển file chứng chỉ từ Redis Enterprise Cloud sang định dạng phù hợp Java SE.

Bước 2.5: Chuyển đổi chứng chỉ

Java SE cung cấp nhiều dịch vụ bảo mật, bao gồm Java Cryptography Architecture (JCA). JCA định nghĩa API để ứng dụng Java gọi dịch vụ bảo mật do các provider cài đặt. Ứng dụng có thể dùng bất kỳ provider nào, nhưng đa số dùng provider mặc định của JDK.

Thách thức của provider mặc định là không hỗ trợ định dạng PEM (thường dùng trong thư viện SSL Linux để lưu chứng chỉ và khóa). Trong JCA, tài liệu chứng chỉ lưu trong kho khóa (keystore) bảo vệ bằng mật khẩu. Ứng dụng Java thường dùng hai kho: keystore lưu chứng chỉ và khóa riêng của client, truststore lưu chứng chỉ CA tin cậy. Redis Enterprise Cloud dùng PEM, nên chúng ta tạo script transmogrify.sh dùng OpenSSL và Java Keytool để chuyển PEM sang truststore và keystore cho client Java.

Chạy script transmogrify.sh từ thư mục giải nén redis_credentials.zip. Script dùng redis_ca.pem tạo truststore redis_truststore.p12, dùng redis_user.crt và redis_user_private.key tạo keystore redisclient_keystore.p12. Keystore được bảo vệ bằng mật khẩu, nhưng hãy bảo mật file keystore. Cả hai file cần phân phối đến mọi client kết nối đến instance Redis database cụ thể, nên tích hợp vào hệ thống quản lý chứng chỉ.

Java trước JDK 9 thích định dạng JKS riêng, nhưng từ JDK 9 trở đi mặc định dùng PKCS12 chuẩn ngành. Script này tạo kho PKCS12; bạn có thể sửa script để dùng JKS bằng cách thay đổi tùy chọn store type và đuôi file.

Bước 3: Cấu hình SSL trong code client

Bước cuối để bật SSL trong client Java là sửa code để thiết lập kết nối SSL. Code mẫu thiết lập kết nối an toàn đến instance Redis Enterprise Cloud, gửi lệnh PING. Code sau khi sửa:

Bạn nhận thấy code không tham chiếu keystore hay truststore tạo ở Bước 2.5. Hành vi mặc định của provider JCA xác thực server; ta chỉ cung cấp thông tin khóa và chứng chỉ. Làm được qua các system property mà provider JCA đọc. Thêm các tham số sau vào cấu hình ứng dụng IDE hoặc dòng lệnh java:

Thuộc tính keystore:

  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStore=/đường/dẫn/redisclient_keystore.p12
  • javax.net.ssl.keyStorePassword=redis

Chỉ định loại (định dạng), vị trí và mật khẩu keystore do script tạo. Tương tự thuộc tính truststore:

  • javax.net.ssl.trustStoreType=PKCS12
  • javax.net.ssl.trustStore=/đường/dẫn/redis_truststore.p12
  • javax.net.ssl.trustStorePassword=redis

Chỉ định loại, vị trí và mật khẩu truststore. Thuộc tính cuối javax.net.debug=ssl:handshake là tùy chọn để bật thông tin debug.

Cấu hình Jedis dùng SSL không quá khó, nhưng có thể gây nản chí nếu chưa quen chuyển đổi chứng chỉ PEM sang keystore/truststore Java. Hy vọng bài viết给了 các fan Java giới thiệu nhẹ nhàng như cho các nhà phát triển Python. Nhắc lại về bảo mật: hầu hết tổ chức có chính sách quản lý mật khẩu và khóa riêng. Hãy kiểm tra với đội vận hành và bảo mật để tuân thủ hướng dẫn của họ.