使用自签名证书

时间:2019-08-13 10:54:39

标签: websocket electron wamp-protocol

我有一个 Electron 应用程序,该应用程序尝试通过Web套接字连接到设备。连接已加密(即wss),但SSL证书是自签名的,因此不受信任。

在Chrome内部连接可以正常使用。但是在Electron内部,我遇到了问题。在certificate-error或应用程序上未放置任何BrowserWindow处理程序的情况下,我在控制台输出中收到以下错误:

  

与'wss:// some_ip:50443 /'的WebSocket连接失败:连接建立错误:net :: ERR_CERT_AUTHORITY_INVALID

然后不久:

  
      
  • 用户正在关闭WAMP连接。...无法访问
  •   

在我的代码中,要建立连接,我运行以下命令。


const connection = new autobahn.Connection({
    realm: 'some_realm',
    url: 'wss://some_ip:50443'
});

connection.onopen = (session, details) => {
    console.log('* User is opening WAMP connection....', session, details);
};

connection.onclose = (reason, details) => {
    console.log('* User is closing WAMP connection....', reason, details);
    return true;
};
connection.open();

// alternatively, this also displays the same error
const socket = new WebSocket(`wss://some_ip:50443`);

socket.onopen = function (event) {
    console.log(event);
};
socket.onclose = function (event) {
    console.log(event);
};

注意::Autobahn是一个Websocket库,用于使用WAMP协议连接到某种套接字服务器。 (在我的情况下是设备)底层协议是wss。在上面的代码下,正在调用本机JS new WebSocket()。换句话说:

正如我提到的,我已经在浏览器窗口中测试了此代码,并且可以正常工作。我还构建了一个较小的应用程序来尝试找出问题所在。还是没有运气。

我尝试将以下代码添加到我的main.js过程脚本中:

app.commandLine.appendSwitch('ignore-certificate-errors');

win.webContents.on('certificate-error', (event, url, error, certificate, callback) => {
    // On certificate error we disable default behaviour (stop loading the page)
    // and we then say "it is all fine - true" to the callback
    event.preventDefault();
    callback(true);
});

app.on('certificate-error', (event, webContents, link, error, certificate, callback) => {
    // On certificate error we disable default behaviour (stop loading the page)
    // and we then say "it is all fine - true" to the callback
    event.preventDefault();
    callback(true);
});

这将错误更改为:

  

与'wss:// some_ip:50443 /'的WebSocket连接失败:WebSocket打开握手已取消

我的理解是,上面的“证书错误”处理程序应转义任何SSL证书错误,并允许应用程序继续运行。但是,事实并非如此。

我还尝试将以下内容添加到main.js

win = new BrowserWindow({
    webPreferences: {
        nodeIntegration: true,
        webSecurity: false
    }
});

process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = '1';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

通过Election,如何正确处理来自不受信任的权威机构的证书?即自签名证书。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我所添加的只是您的电话:

app.commandLine.appendSwitch('ignore-certificate-errors');

我使用socket.io,但我认为其原理相同。 但是,我确实连接到https协议,而不直接连接到wss。

这是我在页面上的连接样子:

socket = io.connect(
        'https://yoursocketserver:yourport', {
            'socketpath',
            secure: false,
            transports: ['websocket']
        });

这似乎已经解决了问题。 谢谢您的帮助:)我希望这个答案对您也有帮助。