Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การเปิดใช้งานการเชื่อมต่อที่ปลอดภัยกับ Redis Enterprise

การสร้างซอฟต์แวร์ที่ใช้การเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ควรเป็นทักษะที่นักพัฒนาทุกคนมี แม้ว่าคุณเลือกที่จะไม่เปิดใช้งาน SSL ในสภาพแวดล้อมการใช้งานจริง คุณควรทราบวิธีรักษาความปลอดภัยการเชื่อมต่อไปยังทุกเซิร์ฟเวอร์ที่คุณทำงานด้วย โพสต์นี้เป็นสัญญาการติดตามการเปิดใช้งานการเชื่อมต่อที่ปลอดภัยกับ Redis Enterprise Cloud ใน Python สำหรับแฟน Java ของเรา

โพสต์นี้จะอธิบายขั้นตอนง่ายๆ ในการเปิด ทดสอบ และกำหนดค่าการเชื่อมต่อที่เข้ารหัสระหว่าง Redis Enterprise Cloud และโปรแกรมไคลเอ็นต์ Java โดยใช้ SSL ส่วนที่สับสนอย่างหนึ่งของการเปิดใช้งาน SSL สำหรับโปรแกรม Java คือการแปลงใบรับรองและคีย์ให้อยู่ในรูปแบบที่ Java เข้าใจ นี่เป็นขั้นตอน Java เท่านั้นที่เราต้องแอบเข้าไประหว่างขั้นตอนการทดสอบและการกำหนดค่าของกระบวนการของเรา

ชุดเครื่องมือ

หยิบเครื่องมือเหล่านี้เพื่อปิดตั๋วเพื่อเปิดใช้งาน SSL บน Redis:

  • บัญชี Redis Enterprise Cloud
  • OpenSSL
  • Java SE JDK
  • เจดิส

คุณจะต้องติดตั้ง Bash shell เพื่อให้คุณสามารถเรียกใช้สคริปต์ขนาดเล็กที่เรามีให้ หากระบบปฏิบัติการของคุณไม่มี Bash เป็นส่วนหนึ่งของการติดตั้งมาตรฐาน คุณจะต้องติดตั้งหรือแปลสคริปต์ของเราเป็นเชลล์ที่คุณต้องการ

หากต้องการใช้ SSL การสมัครใช้งาน Redis Enterprise Cloud ของคุณต้องเปิดใช้งานคุณสมบัติ SSL หากบัญชีของคุณไม่ได้เปิดใช้งาน SSL คุณจะต้องติดต่อทีมสนับสนุน Redis เพื่อเปิดใช้งาน คุณจะพบลิงก์สำหรับติดต่อทีมสนับสนุนในเมนูหลักของแดชบอร์ดบัญชีของคุณ ดูเอกสารประกอบสำหรับการตั้งค่า SSL ได้ใน Redis Enterprise Cloud Operations and Administration Guide

SSL กับ TLS

เตือนความจำ:ในโพสต์ Python ของเรา เราจะทำตามแบบแผนอย่างไม่เป็นทางการของการใช้ตัวย่อ “SSL” เพื่ออ้างถึงการเชื่อมต่อที่ปลอดภัยทั้งแบบ “SSL” หรือ “TLS” แม้ว่า Redis Enterprise Cloud ในปัจจุบัน (มิถุนายน 2018) ใช้เวอร์ชัน 1.2 ของโปรโตคอล TLS เพื่อรักษาความปลอดภัยการเชื่อมต่อ ทั้ง Redis Enterprise Cloud และ Jedis ใช้ “SSL” ดังนั้นเราจะปฏิบัติตาม

ขั้นตอนที่หนึ่งและสอง

สองขั้นตอนแรกจะเหมือนกับขั้นตอนที่ใช้ในการตั้งค่า SSL สำหรับไคลเอนต์ Python แทนที่จะทำซ้ำทั้งหมดที่นี่ เราจะแนะนำคุณกลับไปที่โพสต์ Python ของเรา มีข้อมูลที่เป็นประโยชน์มากมายในโพสต์นั้นสำหรับการทำงานกับ SSL ในทุกภาษา ฉันแนะนำให้คุณอ่านทุกอย่างจนถึงขั้นตอนที่ 3 ก่อนดำเนินการต่อ

กระบวนการเริ่มแตกต่างสำหรับ Java หลังจากขั้นตอนที่ 2 ดังนั้นเราจะแทรกขั้นตอนที่ 2.5 ที่นี่เพื่อแปลงไฟล์ข้อมูลรับรองที่คุณดาวน์โหลดจาก Redis Enterprise Cloud ให้อยู่ในรูปแบบที่ทำงานได้ดีกับ JavaSE

ขั้นตอนที่ 2.5:การแปลงข้อมูลรับรอง

Oracle ให้บริการความปลอดภัยที่หลากหลาย เป็นส่วนหนึ่งของ JavaSE ซึ่งเป็นส่วนมาตรฐานของ Java Cryptography Architecture (JCA) JCA กำหนดชุดของ API สำหรับแอปพลิเคชัน Java เพื่อเรียกใช้บริการความปลอดภัยที่นำมาใช้โดยผู้ให้บริการปลั๊กอิน แอปพลิเคชันสามารถใช้ผู้ให้บริการที่มีอยู่ได้ฟรี (ซึ่งมักจะให้บริการเพิ่มเติมนอกเหนือจาก API มาตรฐาน) แต่แอปพลิเคชันส่วนใหญ่ใช้ผู้ให้บริการเริ่มต้นที่มาพร้อมกับ JDK

ความท้าทายในการใช้ผู้ให้บริการเริ่มต้นคือพวกเขาไม่สนับสนุนรูปแบบ PEM ที่มักใช้กับไลบรารี Linux SSL เพื่อจัดเก็บใบรับรองและคีย์ ใน JCA เอกสารรับรองจะถูกเก็บไว้ในที่เก็บคีย์สโตร์ที่ป้องกันด้วยรหัสผ่าน ในแอปพลิเคชัน Java เป็นเรื่องปกติที่จะใช้ที่เก็บสองแห่ง:หนึ่งถูกอ้างถึงในเอกสารประกอบว่าเป็นที่เก็บคีย์และอีกอันเรียกว่า truststore ที่เก็บคีย์ใช้เพื่อเก็บใบรับรองและคีย์ส่วนตัวสำหรับซอฟต์แวร์ไคลเอ็นต์ และ truststore ใช้เพื่อจัดเก็บใบรับรองที่เชื่อถือได้จากผู้ออกใบรับรอง Redis Enterprise Cloud ใช้รูปแบบ PEM ดังนั้นเราจึงสร้างสคริปต์โดยใช้ OpenSSL และ Java Keytool เพื่อดำเนินการคำสั่งทั้งหมดที่จำเป็นในการแปลงไฟล์ PEM ของคุณเป็น truststore และ keystore ที่ใช้ได้กับโปรแกรมไคลเอนต์ Java ของคุณ

สคริปต์ต่อไปนี้ transmogrify.sh ควรรันจากไดเร็กทอรีที่คุณแตกไฟล์ redis_credentials.zip ของคุณ สคริปต์ใช้ใบรับรอง Redis Certificate Authority (redis_ca.pem) เพื่อสร้าง truststore (redis_truststore.p12) และใช้ใบรับรองไคลเอ็นต์ (redis_user.crt) และคีย์ส่วนตัวที่เกี่ยวข้อง (redis_user_private.key) เพื่อสร้างที่เก็บคีย์ (redisclient_keystore.p12) . แม้ว่าที่เก็บคีย์ของไคลเอ็นต์จะได้รับการปกป้องด้วยรหัสผ่าน คุณควรทำตามขั้นตอนต่างๆ เพื่อรับรองความปลอดภัยของที่เก็บคีย์ของคุณ ทั้งที่เก็บคีย์และ truststore จะต้องถูกแจกจ่ายไปยังไคลเอนต์ทุกเครื่องที่เชื่อมต่อกับอินสแตนซ์ฐานข้อมูล Redis เฉพาะ ดังนั้นคุณจะต้องรวมไฟล์เหล่านี้เข้ากับระบบการจัดการข้อมูลรับรองของคุณอีกครั้ง

เวอร์ชัน Java ก่อนหน้า JDK9 สนับสนุนรูปแบบ Java KeyStore (JKS) ที่เป็นกรรมสิทธิ์ แต่เริ่มต้นด้วย JDK9 Java จะใช้ค่าเริ่มต้นเป็นรูปแบบ PKCS12 มาตรฐานอุตสาหกรรม สคริปต์นี้สร้างที่เก็บรูปแบบ PKCS12 แต่ถ้าคุณแก้ไขสคริปต์ได้ ให้ใช้รูปแบบ JKS โดยเปลี่ยนตัวเลือกประเภทร้านค้าและนามสกุลไฟล์

ขั้นตอนที่ 3:กำหนดค่า SSL ในรหัสไคลเอ็นต์ของคุณ

ขั้นตอนสุดท้ายในการเปิดใช้งาน SSL ในไคลเอ็นต์ Java คือการแก้ไขโค้ดไคลเอ็นต์เพื่อสร้างการเชื่อมต่อ SSL โค้ดตัวอย่างของเราจะสร้างการเชื่อมต่อที่ปลอดภัยกับอินสแตนซ์ Redis Enterprise Cloud จากนั้นส่งคำสั่ง Redis PING รหัสที่แก้ไขของเรามีลักษณะดังนี้:

คุณจะสังเกตเห็นว่าไม่มีที่ใดในโค้ดที่เราอ้างอิงถึงที่เก็บคีย์หรือ truststore ที่เราสร้างขึ้นสำหรับโปรแกรม Java ของเราในขั้นตอนที่ 2.5 ลักษณะการทำงานเริ่มต้นของผู้ให้บริการ JCA รับรองความถูกต้องของเซิร์ฟเวอร์ เราเพียงแค่ต้องให้ข้อมูลคีย์และใบรับรองของเรา สามารถทำได้ด้วยคุณสมบัติของระบบที่อ่านโดยผู้ให้บริการ JCA เพิ่มพารามิเตอร์ต่อไปนี้ในการกำหนดค่าแอปพลิเคชัน IDE หรือบรรทัดคำสั่ง java:

แก้ไขเพื่อใช้ตำแหน่งและรหัสผ่านที่เหมาะสมจากระบบของคุณ

คุณสมบัติที่เก็บคีย์:

  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStore=/Users/tague/dev/ssl-testj/redisclient_keyStore.p12
  • javax.net.ssl.keyStorePassword=redis

ระบุประเภท (รูปแบบ aka) ตำแหน่งและรหัสผ่านสำหรับที่เก็บคีย์ที่สร้างโดยสคริปต์ transmogrify ในทำนองเดียวกัน คุณสมบัติ trustStore:

  • javax.net.ssl.trustStoreType=PKCS12
  • javax.net.ssl.trustStore=/Users/tague/dev/ssl-testj/redis_truststore.p12
  • javax.net.ssl.trustStorePassword=redis

ระบุประเภท ตำแหน่ง และรหัสผ่านของ trustStore คุณสมบัติสุดท้าย javax.net.debug=ssl:handshake เป็นคุณสมบัติทางเลือกที่ใช้ในการเปิดใช้งานข้อมูลการดีบัก

การกำหนดค่า Jedis ให้ใช้ SSL นั้นไม่ใช่เรื่องยากเป็นพิเศษ แต่อาจเป็นไปได้ในตอนแรกหากคุณไม่คุ้นเคยกับขั้นตอนที่จำเป็นในการแปลงข้อมูลรับรอง PEM เป็นคีย์ Java และ truststores

หวังว่าโพสต์นี้จะให้แฟน Java ของเราได้รู้จักกับการตั้งค่าการเชื่อมต่อที่ปลอดภัยกับ Redis Enterprise Cloud ที่เรามอบให้กับนักพัฒนา Python ฉันต้องการเตือนคุณครั้งสุดท้ายเกี่ยวกับการรักษาความปลอดภัย:องค์กรส่วนใหญ่มีนโยบายและขั้นตอนเฉพาะสำหรับการจัดการรหัสผ่านและคีย์ส่วนตัว โปรดตรวจสอบกับฝ่ายปฏิบัติการและทีมรักษาความปลอดภัยเพื่อให้แน่ใจว่าคุณปฏิบัติตามแนวทางปฏิบัติ