gRPC sslcontext config

Sep 28 2020

ฉันยังใหม่กับ gRPC สิ่งที่ฉันพยายามทำคือส่งการโทร ssl gRPC จากไคลเอนต์ไปยังเซิร์ฟเวอร์ คำถามของฉันคือ 'certFile' ในรหัสต่อไปนี้ใบรับรองไคลเอนต์หรือใบรับรองเซิร์ฟเวอร์? หากเป็นใบรับรองไคลเอ็นต์ฉันจำเป็นต้องเพิ่มใบรับรองเซิร์ฟเวอร์ในรายการความน่าเชื่อถือของฉันหรือฉันต้องเพิ่มใบรับรองไคลเอ็นต์ในรายการความน่าเชื่อถือของเซิร์ฟเวอร์ก่อนที่จะโทรออกหรือไม่ ขอบคุณที่คุณช่วย.
   SslContext sslcontext = GrpcSslContexts.forClient()
        .trustManager(caFile)
        .keyManager(certFile, keyFile) 
        .build();

คำตอบ

1 EricAnderson Sep 28 2020 at 22:37

trustManagerและkeyManagerเป็นการแลกเปลี่ยนระหว่างไคลเอนต์ / เซิร์ฟเวอร์ ผู้จัดการความน่าเชื่อถือของลูกค้าต้องไว้วางใจตัวจัดการคีย์ของเซิร์ฟเวอร์และผู้จัดการความน่าเชื่อถือของเซิร์ฟเวอร์จำเป็นต้องไว้วางใจตัวจัดการคีย์ของลูกค้า (หากใช้ใบรับรองไคลเอ็นต์) ความแตกต่างเพียงอย่างเดียวระหว่างไคลเอนต์และเซิร์ฟเวอร์คือเซิร์ฟเวอร์ต้องมีตัวจัดการคีย์และไคลเอนต์ต้องมีผู้จัดการความน่าเชื่อถือ หากคุณไม่ระบุผู้จัดการความน่าเชื่อถือสำหรับลูกค้าระบบจะใช้ค่าเริ่มต้น

ผู้จัดการความน่าเชื่อถือโดยพื้นฐานแล้วเป็นผู้ออกใบรับรองที่เชื่อถือได้ (ไม่ขึ้นอยู่กับไคลเอนต์หรือเซิร์ฟเวอร์) ผู้จัดการคีย์มีใบรับรองข้อมูลประจำตัวและคีย์ส่วนตัวเพื่อพิสูจน์ตัวตนดังกล่าว

ดังนั้นkeyManagerในฝั่งไคลเอ็นต์คือใบรับรองไคลเอ็นต์ คุณจะต้องกำหนดค่าtrustManagerบนฝั่งเซิร์ฟเวอร์เพื่อให้เชื่อถือใบรับรองนั้น: รวมใบรับรองเองหรือที่ดีกว่าคือ Certificate Authority ที่ลงนามในใบรับรองของไคลเอ็นต์ โดยทั่วไปคุณสามารถปล่อยให้ผู้จัดการความน่าเชื่อถือของลูกค้าเป็นค่าเริ่มต้นได้

โปรดทราบว่าไคลเอนต์จะส่งใบรับรองเฉพาะเมื่อเซิร์ฟเวอร์ร้องขอเท่านั้น ดังนั้นคุณต้องกำหนดค่าเซิร์ฟเวอร์เป็นOPTIONALly หรือREQUIREใบรับรองไคลเอ็นต์:

sslContextBuilder.clientAuth(ClientAuth.REQUIRE);