访问打印机时禁止 "localhost wants to access connected printers Untrusted Website" - QZ-tray

Suppress "localhost wants to access connected printers Untrusted Website" when accessing Printers - QZ-tray

如何正确抑制

localhost wants to access connected printers Untrusted Website

访问打印机时模式?

我已尝试通过此 OpenSSL 命令创建证书:

openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -keyout server.key -out server.crt

然后像这样添加覆盖:

authcert.override=server.crt

qz-tray.properties 文件中。

但是还是一样,对话框没有被抑制。有什么问题吗?

这是完整的证书属性文件:

authcert.override=C:\Program Files\QZ Tray\auth\server.crt
wss.alias=qz-tray
wss.keypass=keypass
wss.storepass=storepass
wss.host=0.0.0.0

qz-tray.properties 覆盖将在版本 2.0.2 中引入,在撰写本文时,2.0.1 is the latest stable release

可能的选项:

  • 等待 2.0.2 / compile from source 并使用 qz-tray.properties 覆盖值

    • -- 或--
  • 等待 2.0.2 / compile from source 但在打包时提供证书,这将允许 override.crt 直接与安装程序一起分发。

    ant nsis -Dauthcert.use=override.crt
    
    • -- 或--
  • 使用2.0.1并通过命令行启动带有证书覆盖的软件。例如:

    java -DtrustedRootCert=override.crt -jar qz-tray.jar
    

由于后一个选项需要修改 QZ 托盘桌面启动器,这最终会在启用自动启动时导致不明显的问题(例如 Windows 上的自动启动由 qz-tray.exe 将在没有 -DtrustedRootCert 参数的情况下启动。

这就是为什么在 qz-tray.properties 中永久提供证书的 2.0.2 功能更受欢迎的原因。注意,编译最新的QZ Tray是一个few quick steps.

但这只是成功的一半。要抑制安全警告,每条消息都必须进行数字签名。这是 server.key 发挥作用的地方。我们在示例中称其为 private-key.pem

尽管 can be done client-side with risk of key leakage. This process is explained best in the sign-messages wiki.

签名通常在服务器端完成

签署消息

PHP 签名示例:

<? // sign-message.php

$KEY = 'private-key.pem'; // or 'server.key', etc
$req = $_GET['request'];  // i.e. 'toSign' from JS
$privateKey = openssl_get_privatekey(file_get_contents($KEY));
$signature = null;
openssl_sign($req, $signature, $privateKey);
if ($signature) {
    header("Content-type: text/plain");
    echo base64_encode($signature);
    exit(0);
}
echo '<h1>Error signing message</h1>';
exit(1);

?>

JavaScript:

qz.security.setSignaturePromise(function(toSign) {
    return function(resolve, reject) {
       $.ajax("/foo/bar/sign-message.php?request=" + toSign).then(resolve, reject);
    };
});

qz.security.setCertificatePromise(function(resolve, reject) {
    $.ajax("/foo/bar/digital-certificate.txt").then(resolve, reject); // or `server.crt`, etc
});

注意:为防止密钥泄露,私钥应始终保存在网络浏览器无法访问的目录中。

只是抑制警告

如果你在一台孤立的机器上使用 QZ Tray(就像我的情况)、本地环境或出于任何原因你不需要加密消息而只是想摆脱警告消息你可以禁用警告对话框本身。

免责声明:此方法不应在生产中使用,不会对消息进行签名,任何网站都可以与您的硬件通信,使用风险自负。

  1. 克隆 QZ 托盘存储库 (https://github.com/qzind/tray.git)。
  2. 满足编译依赖:Ant、Java、NSIS (Windows)。 如果您使用 windows,我建议您使用 Chocolatey,使用 Chocolatey 可以直接安装这些依赖项。
  3. 获取代码编辑器或IDE(我使用的是 IntelliJ Idea 社区版)。
  4. 导航和编辑 /src/qz/ws/PrintSocketClient.java换行476

    来自:

    if (cert.isTrusted() && cert.isSaved()) {
    

    进入

    if (cert.isSaved()) {
    
  5. 导航并编辑 /src/qz/ui/GatewayDialog.java 更改行 92

    来自

    allowButton.setEnabled(!persistentCheckBox.isSelected() || cert.isTrusted());
    

    进入

    allowButton.setEnabled(true);
    
  6. 编译使用:

    • ant nsis 对于 windows
    • ant pkgbuild 适用于 MacOS
    • ant makeself 对于 linux

    实际上这不仅会编译,还会创建安装程序。 QZ 团队在自动化一切方面做得很好。

  7. 使用刚刚创建的安装程序安装 QZ 托盘。

  8. 第一次您会看到警告,但现在您可以Remember决定永远Allow

如果您需要真正安全的设置,我建议使用自签名证书或支付高级支持。