สร้างใบรับรอง SSL ที่ลงนามด้วยตนเองที่เชื่อถือได้สำหรับ localhost (สำหรับใช้กับ Express / Node)


130

พยายามทำตามคำแนะนำต่างๆในการสร้างใบรับรองที่ลงนามด้วยตนเองเพื่อใช้กับ localhost คำแนะนำส่วนใหญ่ดูเหมือนจะเป็นสำหรับ IIS แต่ฉันกำลังพยายามใช้ Nodejs / Express ไม่มีสิ่งใดทำงานได้อย่างถูกต้องเนื่องจากในขณะที่ติดตั้งใบรับรองจะไม่เชื่อถือ นี่คือสิ่งที่ฉันพยายามแล้วล้มเหลว:

ใครสามารถเสนอเวิร์กโฟลว์ที่สามารถทำสิ่งนี้ได้? ฉันสามารถติดตั้งใบรับรองได้ แต่ฉันไม่สามารถรับใบรับรองที่เชื่อถือได้ใน chrome (v32) หรือ IE (v10)

แก้ไข: มีการแนะนำในความคิดเห็นว่าปัญหาไม่มีใบรับรองรูทที่เชื่อถือได้ ฉันติดตั้งใบรับรองผ่าน IE แล้ว แต่ก็ยังไม่ได้รับความเชื่อถือ


ไม่มีใบรับรองที่ลงนามด้วยตนเองใดที่สามารถเชื่อถือได้สำหรับเว็บเบราว์เซอร์ พวกเขาไม่ได้ลงนามโดยเจ้าหน้าที่ลงนามที่เชื่อถือได้

1
ไม่เป็นความจริง: คุณสามารถติดตั้งใบรับรองหลักเพื่อให้ใบรับรองที่ลงชื่อด้วยตนเองเชื่อถือได้ แต่ดูเหมือนฉันจะทำสิ่งนี้ไม่ถูกต้อง ฉันอ่านพบว่าคุณสามารถติดตั้ง cert chain ใน IE ได้ (ไม่ใช่ใน chrome) ฉันจึงลอง แต่ก็ยังไม่เป็นที่รู้จัก ฉันไม่รู้ว่าเป็นเพราะ localhost เป็นพิเศษหรือถ้าใบรับรองที่ลงนามด้วยตนเองนั้นไม่ถูกต้อง
JasonS

3
ฉันไม่เคยได้รับใบรับรองที่ลงชื่อด้วยตนเองซึ่งใช้งานได้กับเบราว์เซอร์เช่น Chrome นี่คือวิธีแก้ปัญหาของฉัน: ฉันสร้างรายการ DNS สำหรับ local.MYDOMAIN.com ชี้ไปที่ 127.0.0.1 (localhost) จากนั้นใช้ใบรับรองการผลิตของฉัน สิ่งนี้มีประโยชน์เพิ่มเติมในการตรวจสอบให้แน่ใจว่าไม่มีปัญหากับห่วงโซ่การผลิตของคุณ ฯลฯ
JasonS

คำตอบ:


87

คำตอบข้างต้นเป็นเพียงบางส่วน ฉันใช้เวลามากในการทำงานนี้มันบ้ามาก โปรดสังเกตตัวเองในอนาคตของฉันนี่คือสิ่งที่คุณต้องทำ:

ฉันกำลังทำงานบน Windows 10 กับ Chrome 65 Firefox ทำงานได้ดีเพียงแค่ยืนยันว่า localhost เป็นข้อยกเว้นด้านความปลอดภัยและจะใช้งานได้ Chrome ไม่:

ขั้นตอนที่ 1.ในแบ็กเอนด์ของคุณสร้างโฟลเดอร์ชื่อsecurity. เราจะทำงานในนั้น

ขั้นตอนที่ 2.สร้างไฟล์กำหนดค่าคำขอที่req.cnfมีเนื้อหาต่อไปนี้ (เครดิตไปที่: @Anshul )

req.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = Country initials like US, RO, GE
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost

คำอธิบายของเขตนี้อยู่ที่นี่

ขั้นตอนที่ 3ไปที่โฟลเดอร์ความปลอดภัยในเทอร์มินัลและพิมพ์คำสั่งต่อไปนี้:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256

ขั้นตอนที่ 4.จากนั้นนอกsecurityโฟลเดอร์ในแอปด่วนของคุณให้ทำสิ่งนี้: (เครดิตไปที่ @Diego Mello)

backend 
 /security
 /server.js

server.js:

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
    res.send("IT'S WORKING!")
})

const httpsOptions = {
    key: fs.readFileSync('./security/cert.key'),
    cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
    .listen(port, () => {
        console.log('server running at ' + port)
    })

ขั้นตอนที่ 5เริ่มต้นเซิร์ฟเวอร์node server.jsและไปที่https: // localhost: 3000

ณ จุดนี้เรามีการตั้งค่าเซิร์ฟเวอร์ แต่เบราว์เซอร์ควรแสดงข้อความเตือน

เราจำเป็นต้องลงทะเบียนใบรับรองที่ลงนามด้วยตนเองของเราในฐานะผู้ออกใบรับรองที่เชื่อถือได้ของ CA ในที่เก็บใบรับรอง chrome / windows (chrome บันทึกสิ่งนี้ใน windows ด้วย)

ขั้นตอนที่ 6.เปิด Dev Tools ใน chrome ไปที่แผงความปลอดภัยจากนั้นคลิกที่ดูใบรับรอง ใส่คำอธิบายภาพที่นี่

ขั้นตอนที่ 7.ไปที่แผงรายละเอียดคลิกคัดลอกไฟล์จากนั้นเมื่อตัวช่วยสร้างการส่งออกใบรับรองปรากฏขึ้นให้คลิกถัดไปด้านล่าง:

ไปที่รายละเอียด - คัดลอกไฟล์ - ถัดจากวิซาร์ดการส่งออก

ขั้นตอนที่ 8ลาเข้ารหัส DER คลิกถัดไปเลือกใส่ไว้ในโฟลเดอร์ที่ง่ายต่อการเข้าถึงเช่นสก์ท็อปและชื่อใบรับรองBrowse localhost.cer, then click Save and then Finish.คุณควรจะเห็นใบรับรองของคุณบนเดสก์ท็อป

ขั้นตอนที่ 9.เปิดchrome://settings/โดยใส่ลงในช่อง url ลงมาด้านล่างคลิกแล้วเลื่อนลงไปหาAdvanced / Advanced OptionsManage Certificates

เลือกจัดการใบรับรอง

ขั้นตอนที่ 10ไปที่แผง Trusted Root Certification Authorities แล้วคลิก import

ไปที่แผง Trusted Root Certification Authorities แล้วคลิกนำเข้า

เราจะนำเข้าlocalhost.cerใบรับรองที่เราเพิ่งส่งออกเสร็จในขั้นตอนที่ 8

ขั้นตอนที่ 11.คลิกเรียกดูค้นหาlocalhost.cerปล่อยให้ค่าเริ่มต้นคลิกถัดไปหลาย ๆ ครั้งจนกว่าคำเตือนนี้จะปรากฏขึ้นให้คลิกใช่

ยืนยันข้อยกเว้นด้านความปลอดภัย

ขั้นตอนที่ 12ปิดทุกอย่างแล้วรีสตาร์ท Chrome จากนั้นเมื่อไปที่https://localhost:3000คุณควรเห็น: ต้องรักสีเขียว


สวัสดีเมื่อฉันทำตามขั้นตอนทั้งหมดที่เปิดเสร็จhttps://localhost:3000และ Chrome ค้างขณะโหลด ใครสามารถบอกได้ว่าอาจเป็นเพราะอะไร?
co.zohar

@ co.zohar ข้อความใด ๆ ในคอนโซล? กดcrl+shift+iหรือF12เพื่อเปิดคอนโซล
61

1
หากคุณกำลังทำสิ่งนี้สำหรับที่อยู่บนเครือข่ายฉันพบว่าการตั้งค่า DNS ใบรับรองเป็นชื่อโฮสต์เช่น: DNS.1 = server.local จากนั้นในเครื่องที่เชื่อมต่อจะอัปเดตไฟล์ HOSTS เพื่อชี้ที่อยู่ IP ของเซิร์ฟเวอร์ไปยังชื่อโฮสต์ตัวอย่างเช่น 192.168.0.50 server.localสิ่งนี้จะ อนุญาตให้ใบรับรองและที่อยู่ตรงกันและตรวจสอบใบรับรอง
roskelld

@ บนคอนโซลไม่แสดงอะไรเลย หน้าเว็บจะแสดง: "กำลังรอ localhost ... " คุณกำหนดค่าอะไรในไฟล์โฮสต์หรือไม่
co.zohar

1
ฉันพบคำตอบสำหรับคำถามของตัวเอง: ถ้าคุณเปลี่ยน CN และ DNS.1 เป็นบางอย่างเช่น "local.com" และในคอมพิวเตอร์แต่ละเครื่องที่ต้องการเข้าถึงเซิร์ฟเวอร์ให้เปลี่ยนไฟล์ etc / hosts ให้ชี้ในเครื่อง . com ไปยัง ip ของเซิร์ฟเวอร์การทำงานนี้
TKoL

112

วิธีที่สั้นที่สุด ผ่านการทดสอบบน MacOS แต่อาจทำงานได้ในลักษณะเดียวกันกับระบบปฏิบัติการอื่น

สร้าง pem

> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365

> openssl rsa -in keytmp.pem -out key.pem

เซิร์ฟเวอร์ด่วนของคุณ

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
  res.send('WORKING!')
})

const httpsOptions = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
}
const server = https.createServer(httpsOptions, app).listen(port, () => {
  console.log('server running at ' + port)
})
  • เปิดhttps://localhost:3000ใน Google Chrome แล้วคุณจะเห็นว่าไม่ปลอดภัย ยัง!
  • ในเครื่องมือสำหรับนักพัฒนา> ความปลอดภัย> ดูใบรับรอง: ลากรูปภาพไปที่เดสก์ท็อปของคุณแล้วดับเบิลคลิก
  • คลิก 'เพิ่ม'
  • ค้นหาใน Keychain Access แล้วดับเบิลคลิก
  • ขยาย "Trust" และเปลี่ยน "เมื่อใช้ใบรับรองนี้" เป็น "Always trust"
  • คุณอาจได้รับแจ้งให้ตรวจสอบสิทธิ์
  • รีสตาร์ทเซิร์ฟเวอร์ของคุณ
  • รีเฟรชเบราว์เซอร์ของคุณ
  • สนุก! :)

1
นี่คือการเชื่อมโยงอื่นถ้าคุณต้องการที่จะทำบน Mac: certsimple.com/blog/localhost-ssl-fix
John

สวย! ได้ผล! ฉันต้องการนอกจากนี้: การติดตั้ง OpenSSL จากที่นี่: indy.fulgan.com/SSL/?C=M;O=A รับไฟล์. cnf จากที่นี่: จากนั้นกำหนดค่าจากที่นี่: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/… และกำหนดค่า openSSL จากที่นี่: stackoverflow.com/questions/7360602/…
Jose A

2
ฉันต้องการเพิ่มสำหรับ Chrome 58+ คุณจะได้รับข้อผิดพลาด "Subject Alternative Name missing" stackoverflow.com/a/42917227/1057052 ตรวจสอบคำตอบด้านล่างสำหรับความช่วยเหลือเพิ่มเติม: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Jose A

14
Drag image to your desktop and double click it-> ฉันไม่สามารถลากอะไรไปที่เดสก์ท็อปของฉันไม่สามารถลากได้ .. imageคุณกำลังพูดถึงแร่อะไรกันแน่?
AI ใน

7
หากต้องการเอาชนะ "Subject Alternative Name missing" ใน Chrome คุณสามารถทำได้openssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj /CN=localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:localhost')) -sha256 -days 3650แทนที่จะเป็นบรรทัดแรกที่แนะนำ และคำถามนี้จะถามคำถามน้อยลงในกระบวนการ ...
Michael Litvin

78

คุณสามารถลองใช้ openSSL เพื่อสร้างใบรับรอง ลองดูที่นี้

คุณจะต้องใช้ไฟล์. key และ. crt เพื่อเพิ่ม HTTPS ไปยังเซิร์ฟเวอร์โหนด JS express เมื่อคุณสร้างสิ่งนี้แล้วให้ใช้รหัสนี้เพื่อเพิ่ม HTTPS ไปยังเซิร์ฟเวอร์

var https = require('https');
var fs = require('fs');
var express = require('express');

var options = {
    key: fs.readFileSync('/etc/apache2/ssl/server.key'),
    cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
    requestCert: false,
    rejectUnauthorized: false
};


var app = express();

var server = https.createServer(options, app).listen(3000, function(){
    console.log("server started at port 3000");
});

สิ่งนี้ทำงานได้ดีในเครื่องท้องถิ่นของฉันรวมถึงเซิร์ฟเวอร์ที่ฉันได้ปรับใช้สิ่งนี้ เครื่องที่ฉันมีในเซิร์ฟเวอร์ซื้อจาก goDaddy แต่ localhost มีใบรับรองที่ลงนามด้วยตนเอง

อย่างไรก็ตามทุกเบราว์เซอร์เกิดข้อผิดพลาดว่าการเชื่อมต่อไม่น่าเชื่อถือคุณต้องการดำเนินการต่อหรือไม่ หลังจากที่ฉันคลิกดำเนินการต่อมันใช้งานได้ดี

หากใครเคยข้ามข้อผิดพลาดนี้ด้วยใบรับรองที่ลงนามด้วยตนเองโปรดแจ้ง


9
ใบรับรองของคุณยังไม่น่าเชื่อถือดังนั้นคุณจึงมีปัญหาเดียวกันกับที่ฉันอธิบาย ฉันต้องการให้มันเชื่อถือได้เพื่อทดสอบ / แก้ไขข้อบกพร่องของบริการเว็บอย่างถูกต้อง
JasonS

1
คุณต้องการให้ใบรับรองนี้เชื่อถือได้เฉพาะในเครื่องของคุณเท่านั้นและไม่ได้อยู่ในเครือข่าย?

1
ลิงก์ที่อยู่ด้านบนของคำตอบแนะนำการเข้ารหัส 3DES 1024 บิตซึ่งเป็นวิธีที่ล้าสมัย ดีกว่าใช้openssl genrsa -out key.pem 2048สำหรับคีย์ที่ดีกว่า
นึ่ง

3
ใบรับรองของคุณยังไม่น่าเชื่อถือ
Diego Mello

2
รหัสด่วนด้านบนใช้งานได้โดยใช้github.com/FiloSottile/mkcert (แทน openSSL) เพื่อสร้าง CA / ใบรับรองที่เชื่อถือได้ แท่งสีเขียวตลอดทาง
โสม

11

วิธีสร้างใบรับรอง SSL สำหรับ localhost: ลิงค์

openssl genrsa -des3 -out server.key 1024

คุณต้องป้อนรหัสผ่านที่นี่ซึ่งคุณต้องพิมพ์ใหม่ตามขั้นตอนต่อไปนี้

openssl req -new -key server.key -out server.csr

เมื่อถูกถามว่า "ชื่อสามัญ" พิมพ์ใน: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt

1
นี่คือวิธีแก้ปัญหาอินเทอร์เน็ตที่ระบาดในช่วง 2 ชั่วโมงที่ผ่านมา สำหรับใครก็ตามใน Ubuntu ให้ย้ายcp server.crt /usr/local/share/ca-certificates/.และเรียกใช้sudo update-ca-certificatesคำขอ localhost https ทำงานภายใต้ NodeJS 8+ Id ยังเพิ่มขึ้น1024 to 2048
Salyangoz

6

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

บน windows

1) เพิ่มสิ่งนี้ลงในไฟล์% WINDIR% \ System32 \ drivers \ etc \ hosts ของคุณ: 127.0.0.1 localdev.YOURSITE.net (สาเหตุที่เบราว์เซอร์มีปัญหากับ 'localhost' (สำหรับการเขียนสคริปต์ข้ามแหล่งกำเนิด)

Windows Vista และ Windows 7 Vista และ Windows 7 ใช้ User Account Control (UAC) ดังนั้นต้องเรียกใช้ Notepad ในฐานะผู้ดูแลระบบ

  1. คลิก Start -> All Programs -> Accessories

  2. คลิกขวาที่ Notepad แล้วเลือก Run as administrator

  3. คลิกดำเนินการต่อในหน้าต่าง UAC "Windows ต้องได้รับอนุญาตจากคุณ"

  4. เมื่อ Notepad เปิดขึ้นให้คลิก File -> Open

  5. ในฟิลด์ชื่อไฟล์ให้พิมพ์ C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. คลิกเปิด

  7. เพิ่มสิ่งนี้ลงในไฟล์% WINDIR% \ System32 \ drivers \ etc \ hosts ของคุณ: 127.0.0.1 localdev.YOURSITE.net

  8. บันทึก

  9. ปิดและรีสตาร์ทเบราว์เซอร์

บน Mac หรือ Linux:

  1. เปิด / etc / hosts โดยsuได้รับอนุญาต
  2. เพิ่ม 127.0.0.1 localdev.YOURSITE.net
  3. บันทึกไว้

เมื่อพัฒนาคุณใช้ localdev.YOURSITE.net แทน localhost ดังนั้นหากคุณใช้การกำหนดค่ารัน / ดีบักในอุดมคติของคุณอย่าลืมอัปเดต

ใช้ ".YOURSITE.net" เป็น cookiedomain (โดยมีจุดขึ้นต้น) เมื่อสร้าง Cookiem ควรใช้กับโดเมนย่อยทั้งหมด

2) สร้างใบรับรองโดยใช้ localdev.url นั้น

เคล็ดลับ: หากคุณมีปัญหาในการสร้างใบรับรองบน ​​windows ให้ใช้เครื่อง VirtualBox หรือ Vmware แทน

3) นำเข้าใบรับรองตามที่ระบุไว้ใน http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/


สวัสดีทรอยขอบคุณสำหรับการแบ่งปันสิ่งนี้ คนอื่นจะต้องแสดงความคิดเห็นว่ามันได้ผลหรือไม่ วิธีแก้ปัญหาของฉัน: ฉันลงเอยด้วยการเพิ่ม dev.phantomjscloud.com ไปยังไฟล์โฮสต์ของฉันจากนั้นใช้ใบรับรองการผลิตของฉัน นั่นจะมีประโยชน์ก็ต่อเมื่อคุณต้องการให้คีย์การผลิตของคุณมีอยู่ในกล่อง dev ของคุณดังนั้นฉันคิดว่าโซลูชันของคุณยังคงใช้ได้หากมีคนอื่นสามารถตรวจสอบได้
JasonS

มันใช้ได้ผลสำหรับฉันและทีมของฉันด้วยวิธีการผสมผสานระหว่างการรักษาความปลอดภัยภายในเครื่องกับเซิร์ฟเวอร์ภายในเพื่อรักษาความปลอดภัยภายในเครื่องไปยังเซิร์ฟเวอร์ที่ใช้งานจริง
TroyWorks

สำหรับ Windows, คอนโซลทุบตีคอมไพล์ใช้งานได้ดีโดยใช้คำสั่ง OpenSSL จากที่นี่ เพียงแค่ต้องติดตั้งใบรับรองหลักและคุณสามารถสร้างใบรับรองเฉพาะไซต์หลายรายการที่ลงนามโดยถ้าคุณต้องการ
Jason Goemaat

6

Mkcertจาก @FiloSottile ทำให้กระบวนการนี้ง่ายขึ้นอย่างไม่มีที่สิ้นสุด:

  1. ติดตั้งmkcertมีคำแนะนำสำหรับ macOS / Windows / Linux
  2. mkcert -install เพื่อสร้าง CA ท้องถิ่น
  3. mkcert localhost 127.0.0.1 ::1 เพื่อสร้างใบรับรองที่เชื่อถือได้สำหรับ localhost ในไดเร็กทอรีปัจจุบัน
  4. คุณกำลังใช้โหนด (ซึ่งไม่ใช้ที่เก็บรากของระบบ) ดังนั้นคุณต้องระบุ CA อย่างชัดเจนในตัวแปรสภาพแวดล้อมเช่น:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. สุดท้ายเรียกใช้เซิร์ฟเวอร์ด่วนของคุณโดยใช้การตั้งค่าที่อธิบายไว้ในคำตอบอื่น ๆ (เช่นด้านล่าง)
  6. ความเจริญ localhost ว่ายน้ำเป็นสีเขียว

การตั้งค่าโหนดพื้นฐาน:

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();    
const server = https.createServer({
    key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
    cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
    requestCert: false,
    rejectUnauthorized: false,
}, app).listen(10443); // get creative

ทำงานได้ดีมาก! ด้วยวิธีนี้เราไม่จำเป็นต้องลงทะเบียนใบรับรองที่ลงนามด้วยตนเองในฐานะผู้ออกใบรับรองที่เชื่อถือได้ของ CA ในที่เก็บใบรับรอง chrome / windows ดังที่กล่าวไว้ในคำตอบอื่น ๆ .
zaheer

4

หากคุณใช้ OSX / Chrome คุณสามารถเพิ่มใบรับรอง SSL ที่ลงชื่อด้วยตนเองลงในพวงกุญแจระบบของคุณได้ตามคำอธิบายที่นี่: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -self ลงนามกับ SSL ใบรับรอง

มันเป็นกระบวนการแบบแมนนวล แต่ในที่สุดฉันก็ใช้งานได้ ตรวจสอบให้แน่ใจว่า Common Name (CN) ถูกตั้งค่าเป็น "localhost" (โดยไม่มีพอร์ต) และหลังจากเพิ่มใบรับรองแล้วให้ตรวจสอบว่าตัวเลือก Trust ทั้งหมดในใบรับรองถูกตั้งค่าเป็น "Always Trust" ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มลงในพวงกุญแจ "ระบบ" ไม่ใช่พวงกุญแจ "ล็อกอิน"


เขากล่าวถึง IE ซึ่งหมายความว่าเขาใช้ Windows
2 บิต

3

หากคุณใช้โหนดทำไมไม่สร้างด้วยโหนด โมดูลนี้ดูเหมือนจะมีคุณสมบัติครบถ้วน:

โปรดทราบว่าฉันจะไม่สร้างขึ้นทันที สร้างด้วย build script บางประเภทเพื่อให้คุณมีใบรับรองและคีย์ที่สอดคล้องกัน มิฉะนั้นคุณจะต้องอนุญาตใบรับรองที่ลงนามด้วยตนเองที่สร้างขึ้นใหม่ทุกครั้ง


3

คำตอบบางส่วนที่โพสต์มีชิ้นส่วนที่มีประโยชน์มากสำหรับฉันในการเอาชนะปัญหานี้ด้วย อย่างไรก็ตามฉันสนใจจำนวนขั้นต่ำขั้นต่ำและควรหลีกเลี่ยง OpenSSL (บน Windows 10)

ดังนั้นสิ่งสำคัญอย่างหนึ่งจากคำตอบ (เครดิต: @ TroyWorks ) คือคุณต้องแก้ไขไฟล์ HOSTS ของคุณเพื่อสร้างเซิร์ฟเวอร์สมมติและจับคู่กับ 127.0.0.1 สิ่งนี้ถือว่าคุณกำลังจะพัฒนาท้องถิ่น

ในกรณีของฉันฉันใช้ใบรับรอง SS เพื่อรักษาความปลอดภัย websocket ใน NodeJS และซ็อกเก็ตนั้นกำลังเชื่อมต่อกับทางโปรแกรม (ตรงข้ามกับผ่านเบราว์เซอร์) ดังนั้นสำหรับฉันเป็นเรื่องสำคัญที่ใบรับรองจะได้รับการยอมรับโดยไม่มีคำเตือนหรือข้อผิดพลาดและสิ่งสำคัญคือต้องได้รับใบรับรองที่สร้างด้วย CN ที่เหมาะสม (และแน่นอนยอมรับใบรับรองในหน่วยงานที่เชื่อถือได้ตามที่อธิบายไว้ที่อื่นในคำตอบ) . การใช้ IIS เพื่อสร้างใบรับรองที่ลงนามด้วยตนเองจะไม่สร้าง CN ที่เหมาะสมดังนั้นฉันจึงค้นพบคำสั่งง่ายๆต่อไปนี้โดยใช้ Powershell:

New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My"

สิ่งนี้จะต้องถูกเรียกใช้ในคอนโซลผู้ดูแลระบบ PS แต่ก็ใช้งานได้และใส่ใบรับรองลงในส่วน "ส่วนตัว" ของที่เก็บใบรับรอง LocalMachine คุณสามารถตรวจสอบได้ว่าสร้างขึ้นโดยดำเนินการ:

ls cert:\LocalMachine\My 

หากต้องการเชื่อถือเพียงคัดลอกสิ่งนี้และวางลงใน "Trusted Root Certification Authorities" โดยใช้ Certificate Manager (ตรวจสอบให้แน่ใจว่าคุณกำลังดูใบรับรอง Local Machine ไม่ใช่ผู้ใช้ปัจจุบัน!)

หากคุณเชื่อมโยงกับใบรับรองนี้ใน IIS คุณควรจะสามารถกดhttps://gandalf.dummy.dev/และรับการเชื่อมต่อที่ปลอดภัยโดยไม่มีคำเตือนใด ๆ

ส่วนสุดท้ายโดยใช้สิ่งนี้ใน NodeJS ได้อธิบายไว้ข้างต้นและในคำตอบ SO อื่น ๆ ดังนั้นฉันจะเพิ่มเฉพาะใน Windows เท่านั้นการทำงานกับไฟล์ pfx ที่รวมใบรับรองและคีย์ส่วนตัวจะง่ายกว่า คุณสามารถส่งออก pfx ได้อย่างง่ายดายจาก Certificate Manager แต่จะส่งผลต่อวิธีการใช้งานใน NodeJS เมื่อสร้างอินสแตนซ์เซิร์ฟเวอร์โดยใช้โมดูล 'https' ตัวเลือกที่คุณจะใช้ (แทน 'key' และ 'cert') จะเป็น 'pfx' และ 'passphrase' ดังใน:

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);

2

บน windows ฉันทำให้ใบรับรองการพัฒนา iis เชื่อถือได้โดยใช้ MMC (start> run> mmc) จากนั้นเพิ่มสแนปอินใบรับรองเลือก "คอมพิวเตอร์ในระบบ" และยอมรับค่าเริ่มต้น เมื่อเพิ่มสแนปปิปใบรับรองนั้นแล้วให้ขยายแผนผังใบรับรองคอมพิวเตอร์ในระบบเพื่อดูภายใต้ส่วนบุคคลเลือกใบรับรอง localhost คลิกขวา> งานทั้งหมด> ส่งออก ยอมรับค่าเริ่มต้นทั้งหมดในวิซาร์ดการส่งออก

เมื่อบันทึกไฟล์แล้วให้ขยายใบรับรองที่เชื่อถือได้และเริ่มนำเข้าใบรับรองที่คุณเพิ่งส่งออก https://localhostตอนนี้ได้รับความไว้วางใจใน chrome โดยไม่มีคำเตือนด้านความปลอดภัย

ฉันใช้ความละเอียดคู่มือนี้# 2จากบล็อก MSDN op ยังแชร์ลิงก์ในคำถามของเขาเกี่ยวกับเรื่องนี้ว่าควรใช้ MMC ด้วย แต่ก็ใช้ได้ผลสำหรับฉัน ความละเอียด # 2


2

ไปที่: chrome://flags/

เปิดใช้งาน: อนุญาตใบรับรองที่ไม่ถูกต้องสำหรับทรัพยากรที่โหลดจาก localhost

คุณไม่มีความปลอดภัยสีเขียว แต่คุณได้รับอนุญาตให้ใช้https: // localhostใน chrome เสมอ


2

มีหลายแง่มุมกว่านี้

คุณสามารถบรรลุ TLS (บางคนก็พูดว่า SSL) ด้วยใบรับรองลงนามด้วยตนเองหรือไม่ก็ได้

หากต้องการมีแถบสีเขียวสำหรับใบรับรองที่ลงนามด้วยตนเองคุณจะต้องเป็นผู้ออกใบรับรอง (CA) ด้วย ด้านนี้ขาดหายไปในแหล่งข้อมูลส่วนใหญ่ที่ฉันพบในการเดินทางเพื่อบรรลุแถบสีเขียวในการตั้งค่าการพัฒนาในพื้นที่ของฉัน การเป็น CA นั้นง่ายพอ ๆ กับการสร้างใบรับรอง

ทรัพยากรนี้ครอบคลุมการสร้างทั้งใบรับรอง CA และใบรับรองเซิร์ฟเวอร์และส่งผลให้การตั้งค่าของฉันแสดงแถบสีเขียวบน Localhost Chrome, Firefox และ Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

โปรดทราบ: ใน Chrome คุณต้องเพิ่มใบรับรอง CA ให้กับหน่วยงานที่เชื่อถือได้ของคุณ


0

หากคุณต้องการก้าวไปไกลกว่าขั้นตอนโดยละเอียดของ @ alon และสร้าง ca ที่ลงนามด้วยตนเอง:

https.createServer({
  key: fs.readFileSync(NODE_SSL_KEY),
  cert: fs.readFileSync(NODE_SSL_CERT),
  ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

package.json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

ใช้localhost.cnfตามที่อธิบายไว้:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.