การตั้งค่า https คุกกี้ใน nodejs

Aug 23 2020

ฉันพยายามตั้งค่าระบบล็อกอินบนเว็บไซต์ของฉันมากเกินไป

ได้ยินมาว่าคุกกี้ nodejs เป็นวิธีที่ดีในการทำเช่นนั้น

ในลิงค์ต่อไปนี้:
https://stackoverflow.com/a/21809393/322537
https://nodejs.org/dist/latest-v8.x/docs/api/https.html
ฉันพบตัวอย่างวิธีสร้างเซิร์ฟเวอร์ https เป็นความเข้าใจของฉันว่าฟังก์ชัน createServer ควรทำงานทุกครั้งที่ลูกค้าส่งคำขอ

ดังนั้นฉันจึงมีสิ่งต่อไปนี้ในรหัสของฉัน:

var server_https=modules.https.createServer({
    key: this.ssl_key,
    cert:this.ssl_cert
    },this.respond_to_client).listen(this.port);


mconnection.prototype.respond_to_client=function(request,response){
    console.log('responded to client');
    }

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

เป็นไปได้อย่างไร? มีบางอย่างเกี่ยวข้องกับการที่ฉันอัปเกรดเซิร์ฟเวอร์ https เป็น websocket ในภายหลังในโค้ดได้หรือไม่?

อัปเดต:
นี่คือไฟล์เซิร์ฟเวอร์:
https://openage.org/s.js
นี่คือโมดูลการเชื่อมต่อ:
https://openage.org/c.js

และนี่คือโปรแกรมแชทที่ให้บริการ
https://openage.org/chat/14/?page=index

แผนคือการสร้างคุกกี้เพื่อระบุลูกค้าจากนั้นจึงตั้งค่าระบบล็อกอิน แต่ฉันติดอยู่ที่นี่ /:

คำตอบ

3 factorypolaris Aug 26 2020 at 17:27

ฉันได้จำลองสคริปต์โหนดของคุณสำหรับการทดสอบภายในเครื่องแล้ว ก่อนอื่นฉันมีสิ่งต่างๆที่ทำงานบน http (เทียบกับ https) และสามารถรับการตอบสนองได้ดี อย่างไรก็ตามเมื่อย้ายไปที่ https คำขอจะไม่ได้รับจากเซิร์ฟเวอร์ เบราว์เซอร์ต้องสร้างการเชื่อมต่อที่ปลอดภัยก่อนที่จะส่งคำขอจริง

ฉันพบปัญหาที่คล้ายกันเมื่อพยายามเรียกใช้เซิร์ฟเวอร์หลายตัว (https และ ws) บนพอร์ตเดียวกัน สิ่งที่คุณมีอยู่ใกล้มาก แต่การตั้งค่า https.createServer ({ตัวเลือก} ตัวจัดการ) จำเป็นต้องมีการปรับเปลี่ยน

ที่คุณมี:

var server_https= https.createServer({
        key: this.ssl_key,
        cert:this.ssl_cert
},respond_to_client).listen(this.port);

คุณต้องเพิ่มตัวเลือกสำหรับ "ca" ด้วย:

var server_https= https.createServer({
        key: this.ssl_key,
        cert: this.ssl_cert,
        ca: this.ssl_ca,  // also add this
},respond_to_client).listen(this.port);

ค่าที่ฉันใช้สำหรับ "ca" คือเนื้อหาของไฟล์: intermediate.crt ที่ได้รับจากผู้ลงนามใบรับรอง


สำคัญ

แม้ว่าอาจเป็นไปได้ที่จะทำงานนี้โดยใช้ใบรับรองที่ลงนามด้วยตนเอง แต่ฉันไม่เคยทำได้เนื่องจากไม่มีอำนาจลงนาม


เช่นเดียวกับที่คุณทำกับไฟล์ใบรับรองอื่น ๆ ของคุณคุณควรทำเช่นนี้กับไฟล์ intermediate.crt

//Where you read your other cert files: add another.
this.ssl_ca = modules.fs.readFileSync(this.ssl_ca_pathfile);

ฉันพบว่านี่เป็นเรื่องยากและเอกสารไม่ดี ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับ SSL / TSL แต่การค้นหาอย่างรวดเร็วเกี่ยวกับใบรับรองระดับกลางปรากฏขึ้น:

ใบรับรองระดับกลางคือใบรับรองรองที่ออกโดยรูทที่เชื่อถือได้โดยเฉพาะเพื่อออกใบรับรองเซิร์ฟเวอร์เอนทิตีปลายทาง ผลลัพธ์คือห่วงโซ่ใบรับรองที่เริ่มต้นที่ CA รูทที่เชื่อถือได้ผ่านตัวกลางและลงท้ายด้วยใบรับรอง SSL ที่ออกให้คุณ ใบรับรองดังกล่าวเรียกว่าใบรับรองหลักที่ถูกล่ามโซ่ ที่มา

intermediate.crt จะมีโครงสร้างดังนี้

-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----

นี่คือการตอบสนองในเบราว์เซอร์