apt-get 与 https 不兼容

apt-get 与 https 不兼容

我在服务器上设置了一个 (私有) apt 存储库。我只允许通过 SSL 访问此存储库,并且只能使用客户端证书。我已使用 curl 测试了连接:

$ curl --cacert /opt/CA.crt --cert /opt/user.crt --key /opt/user.key --pass 1234 https://example.com/dists/lucid/main/binary-amd64/Packages.gz

内容按预期下载。

我在 /etc/apt/apt.conf.d/45example-com 中创建了一个文件,其中包含

Debug::Acquire::https "true";

Acquire::https::example.com {
    Verify-Peer "true";
    Verify-Host "true";

    CaInfo "/opt/CA.crt";

    SslCert "/opt/user.crt";
    SslKey  "/opt/user.key";
};

我在 /etc/apt/sources.list.d/example.com.list 添加了一个文件,内容如下:

deb https://example.com/ lucid main

CA 证书似乎有问题,当我尝试更新时,出现以下信息:

# apt-get update
* Connected to example.com (8.0.0.8) port 443 (#0)
* found 1 certificates in /opt/CA.crt
* error reading X.509 key or certificate file
* Closing connection #0

example.com 上的服务器日志显示没有收到任何请求,因此我猜测 apt-get 在尝试发送请求(与日志所述的内容相符)之前就失败了。

我很难在互联网上找到有关 apt-get 和 ssl 的任何文档,甚至无法找到源代码。

有人有什么想法吗?

答案1

经过一番搜索后,我对正在发生的事情有了更好的了解(但还没有解决方案)。

我找到了 apt 的源代码https://code.launchpad.net/~ubuntu-branches/ubuntu/lucid/apt/lucid。它使用 libcurl 进行 ssl,而后者又使用 gntls。

错误消息来自 libcurl,它抱怨的是密钥/密码,而不是 CA 证书。行:

* found 1 certificates in /opt/CA.crt

表示 CA.crt 已正确加载。错误消息来自以下方面:

if(gnutls_certificate_set_x509_key_file(
     conn->ssl[sockindex].cred,
     data->set.str[STRING_CERT],
     data->set.str[STRING_KEY] ?
     data->set.str[STRING_KEY] : data->set.str[STRING_CERT],
     do_file_type(data->set.str[STRING_CERT_TYPE]) ) !=
   GNUTLS_E_SUCCESS) {
  failf(data, "error reading X.509 key or certificate file");
  return CURLE_SSL_CONNECT_ERROR;
}

(来自 gtls.c 中的http://alpha.gnu.org/gnu/gnutls/libtasn1-0.2.10.tar.gz

问题出在与该密钥关联的密码上。我使用以下命令从密钥中删除了密码:

$ openssl rsa -in user.key -out user-nopasswd.key

这并不理想,但似乎有效。

答案2

我在尝试让 apt-get 通过 https 运行时遇到的一个问题是安全证书你不能使用.pem文件,因为 apt-get 无法将其识别为用于连接到存储库的有效格式。我有一个自签名 .pem 文件,用于连接到我的网络服务器,它是 .pem 格式,这就是我尝试使用它的原因。

解决方案是将 .pem 拆分为正确的文件 .crt 和 .key,然后 apt-get 即可成功连接。

总结:分割你的.pem文件放入.crt和一个。钥匙并且它会起作用。

答案3

实际上,您不必像@ihatecache 所述那样拆分它们,您可以将证书和密钥都设置为单个 pem:

Acquire::https {
            SslCert "/opt/user.pem";
            SslKey  "/opt/user.pem";
        };

相关内容