場景
我使用的electron 27版本。
眾所周知,navigator.mediaDevices.getUserMedia
API只能在https環境下使用,在非https環境下使用時navigator.mediaDevices
會返回undefined。除了例外的這幾種情況。
例外的幾種情況在MDN 安全上下文文章中進行了說明說明了。
大致意思是在https,file,localhost這幾種協議下會認為是安全的上下文。
第一種方式:使用chromium的命令列開關來控制(親測沒問題)。
在app.whenReady
前載入前載入以下Chromium命令列開關來控制那些是安全上下文(可以逗號分隔的列表形式提供多個來源)。
const { app, ... } = require("electron");
...
app.commandLine.appendSwitch('unsafely-treat-insecure-origin-as-secure', 'http://www.demo.com,http://domain2.com,http://domain3.com');
第二種方式:就是使用簽名證書來進行簽名地址(這裡使用自簽名證書的方式)。
-- 建立本地私有金鑰
openssl genrsa -out ssl.key 2048
-- 按提示輸入即可
openssl req -new -key ssl.key -out ssl.csr
-- 建立證書crt
openssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt
-- 建立證書pem
openssl dhparam -out ssl.pem 2048
Nginx關於ssl的配置
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES;
}
see
- https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
- https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts
- 使用命令列開關執行 Chromium
- Chromium支援的命令列全部開關
- Chromium官方