Xây dựng phần mềm sử dụng các kết nối an toàn với máy chủ phải là một kỹ năng mà mọi nhà phát triển phải có. Ngay cả khi bạn chọn không bật SSL trong một môi trường sản xuất cụ thể, bạn nên biết cách bảo mật các kết nối tới mọi máy chủ mà bạn làm việc. Bài đăng này là phần tiếp theo được hứa hẹn về việc Bật kết nối an toàn với Redis Enterprise Cloud bằng Python cho người hâm mộ Java của chúng tôi.
Bài đăng này hướng dẫn một quy trình dễ dàng để bật, kiểm tra và định cấu hình các kết nối được mã hóa giữa Redis Enterprise Cloud và một chương trình khách Java sử dụng SSL. Một trong những phần khó hiểu khi bật SSL cho các chương trình Java là chuyển đổi chứng chỉ và khóa thành định dạng mà Java hiểu được. Đây là quy trình chỉ dành cho Java mà chúng tôi phải thực hiện giữa các bước kiểm tra và cấu hình trong quy trình của chúng tôi.
Bộ công cụ
Sử dụng các công cụ này để bạn có thể đóng vé đó cho việc bật SSL trên Redis:
- Tài khoản Redis Enterprise Cloud
- OpenSSL
- Java SE JDK
- Jedis
Bạn cũng sẽ cần cài đặt Bash shell để có thể chạy một tập lệnh nhỏ mà chúng tôi cung cấp. Nếu hệ điều hành của bạn không bao gồm Bash như một phần của cài đặt tiêu chuẩn, bạn sẽ cần cài đặt nó hoặc dịch tập lệnh của chúng tôi sang trình bao ưa thích của bạn.
Để sử dụng SSL, đăng ký Redis Enterprise Cloud của bạn phải được bật tính năng SSL. Nếu tài khoản của bạn chưa được bật SSL, bạn sẽ cần liên hệ với nhóm hỗ trợ Redis để kích hoạt nó. Bạn sẽ tìm thấy một liên kết để liên hệ với nhóm hỗ trợ trong menu chính của trang tổng quan tài khoản của bạn. Tài liệu để thiết lập SSL có thể được tìm thấy trong Hướng dẫn quản trị và vận hành đám mây của Redis Enterprise.
SSL so với TLS
Chỉ xin nhắc lại:như trong bài đăng Python của chúng tôi, chúng tôi sẽ tuân theo quy ước không chính thức về việc sử dụng từ viết tắt “SSL” để chỉ các kết nối được bảo mật “SSL” hoặc “TLS”. Mặc dù Redis Enterprise Cloud hiện tại (tháng 6 năm 2018) sử dụng phiên bản 1.2 của giao thức TLS để bảo mật kết nối, cả Redis Enterprise Cloud và Jedis đều sử dụng “SSL”, vì vậy chúng tôi sẽ làm theo.
Bước Một và Hai
Hai bước đầu tiên giống với những bước được sử dụng để thiết lập SSL cho một ứng dụng Python. Thay vì lặp lại tất cả ở đây, chúng tôi sẽ giới thiệu bạn trở lại bài đăng Python của chúng tôi. Có rất nhiều thông tin hữu ích trong bài đăng đó để làm việc với SSL ở bất kỳ ngôn ngữ nào. Tôi khuyên bạn nên đọc mọi thứ cho đến Bước 3 trước khi tiếp tục.
Quá trình bắt đầu phân kỳ cho Java sau Bước 2, vì vậy chúng tôi sẽ chèn Bước 2.5 vào đây để chuyển đổi các tệp thông tin xác thực bạn đã tải xuống từ Redis Enterprise Cloud thành một định dạng hoạt động tốt với JavaSE.
Bước 2.5:Chuyển đổi thông tin đăng nhập
Là một phần tiêu chuẩn của JavaSE, Oracle cung cấp nhiều dịch vụ bảo mật khác nhau, bao gồm cả Kiến trúc mật mã Java (JCA). JCA định nghĩa một tập hợp các API cho các ứng dụng Java để gọi các dịch vụ bảo mật được triển khai bởi các nhà cung cấp trình cắm thêm. Các ứng dụng được miễn phí sử dụng bất kỳ nhà cung cấp nào có sẵn (những người này thường cung cấp các dịch vụ bổ sung ngoài API tiêu chuẩn), nhưng hầu hết các ứng dụng sử dụng các nhà cung cấp mặc định được vận chuyển cùng với JDK.
Thách thức của việc sử dụng các nhà cung cấp mặc định là họ không hỗ trợ định dạng PEM thường được sử dụng với các thư viện SSL của Linux để lưu trữ chứng chỉ và khóa. Trong JCA, tài liệu thông tin xác thực được lưu trữ trong các kho lưu trữ khóa được bảo vệ bằng mật khẩu. Trong các ứng dụng Java, người ta thường sử dụng hai kho lưu trữ:một kho được gọi trong tài liệu là kho khóa và kho còn lại được gọi là kho tin cậy. Kho khóa được sử dụng để lưu trữ các chứng chỉ và khóa cá nhân cho phần mềm máy khách và kho tin cậy được sử dụng để lưu trữ các chứng chỉ đáng tin cậy từ tổ chức phát hành chứng chỉ. Định dạng PEM được Redis Enterprise Cloud sử dụng, vì vậy chúng tôi đã tạo một tập lệnh sử dụng OpenSSL và Java Keytool để thực thi tất cả các lệnh cần thiết để chuyển đổi tệp PEM của bạn thành kho tin cậy và kho khóa có thể sử dụng cho các chương trình khách Java của bạn.
Tập lệnh sau, transmogrify.sh, sẽ được chạy từ thư mục mà bạn đã giải nén redis_credentials.zip của mình. Tập lệnh sử dụng chứng chỉ Tổ chức phát hành chứng chỉ Redis (redis_ca.pem) để tạo kho tin cậy (redis_truststore.p12) và sử dụng chứng chỉ ứng dụng khách (redis_user.crt) và khóa riêng tương ứng (redis_user_private.key) để tạo kho khóa (redisclient_keystore.p12) . Mặc dù kho khóa ứng dụng được bảo vệ bằng mật khẩu, bạn vẫn nên thực hiện các bước để đảm bảo an toàn cho kho khóa của mình. Cả kho khóa và kho tin cậy sẽ cần được phân phối cho mọi máy khách kết nối với một phiên bản cơ sở dữ liệu Redis cụ thể, vì vậy, một lần nữa bạn sẽ muốn tích hợp các tệp này vào hệ thống quản lý thông tin xác thực của mình.
Các phiên bản Java trước JDK9 ưa chuộng định dạng Java KeyStore (JKS) độc quyền, nhưng bắt đầu với JDK9, Java được mặc định theo định dạng PKCS12 tiêu chuẩn của ngành. Tập lệnh này tạo các cửa hàng định dạng PKCS12, nhưng nếu bạn có thể sửa đổi tập lệnh, hãy sử dụng định dạng JKS bằng cách thay đổi tùy chọn loại cửa hàng và phần mở rộng tệp.
Bước 3:Định cấu hình SSL trong mã khách hàng của bạn
Bước cuối cùng để bật SSL trong máy khách Java của bạn là sửa đổi mã máy khách để thiết lập kết nối SSL. Mã mẫu của chúng tôi sẽ thiết lập kết nối an toàn đến phiên bản Redis Enterprise Cloud của chúng tôi, sau đó gửi lệnh Redis PING. Mã sửa đổi của chúng tôi trông giống như:
Bạn sẽ nhận thấy, không có chỗ nào trong mã mà chúng tôi tham chiếu đến kho khóa hoặc kho tin cậy mà chúng tôi đã tạo cho chương trình Java của mình ở Bước 2.5. Hành vi mặc định của các nhà cung cấp JCA xác thực máy chủ; chúng tôi chỉ cần cung cấp thông tin khóa và chứng chỉ của chúng tôi. Điều này có thể được thực hiện với các thuộc tính hệ thống được đọc bởi các nhà cung cấp JCA. Thêm các tham số sau vào cấu hình ứng dụng IDE của bạn hoặc dòng lệnh java:
sửa đổi chúng để sử dụng các vị trí và mật khẩu thích hợp từ hệ thống của bạn.
Các thuộc tính kho khóa:
- javax.net.ssl.keyStoreType =PKCS12
- javax.net.ssl.keyStore =/ Users / tague / dev / ssl-testj / redisclient_keyStore.p12
- javax.net.ssl.keyStorePassword =redis
chỉ định loại (hay còn gọi là định dạng), vị trí và mật khẩu cho kho khóa được tạo bởi tập lệnh transmogrify. Tương tự, các thuộc tính trustStore:
- javax.net.ssl.trustStoreType =PKCS12
- javax.net.ssl.trustStore =/ Users / tague / dev / ssl-testj / redis_truststore.p12
- javax.net.ssl.trustStorePassword =redis
chỉ định loại, vị trí và mật khẩu của TrustStore. Thuộc tính cuối cùng javax.net.debug =ssl:handshake là một thuộc tính tùy chọn được sử dụng để kích hoạt thông tin gỡ lỗi.
Việc định cấu hình Jedis để sử dụng SSL không đặc biệt khó, nhưng ban đầu có thể gây khó khăn nếu bạn chưa quen với các bước cần thiết để chuyển đổi thông tin đăng nhập PEM thành khóa Java và kho tin cậy.
Hy vọng rằng bài đăng này đã cung cấp cho người hâm mộ Java của chúng tôi phần giới thiệu nhẹ nhàng về cách thiết lập kết nối an toàn với Redis Enterprise Cloud mà chúng tôi đã cung cấp cho các nhà phát triển Python. Tôi muốn để lại cho bạn một lời nhắc cuối cùng về bảo mật:hầu hết các tổ chức đều có các chính sách và thủ tục cụ thể để quản lý mật khẩu và khóa cá nhân. Hãy nhớ kiểm tra với các nhóm hoạt động và bảo mật của bạn để đảm bảo rằng bạn đang tuân thủ các nguyên tắc của họ.