难以获得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失败(与日志所说的匹配)。

我很难在interwebs上找到关于apt-get和ssl的任何文档,甚至都找不到源代码。

有没有人有任何想法?

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

我在https://code.launchpad.net/~ubuntu-branches/ubuntu/lucid/apt/lucid找到了apt的源代码。 它使用libcurl for ssl,而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; } 

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

问题在于与该密钥关联的密码。 我使用以下方法从密钥中删除了密码:

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

这不是理想的,但似乎有效。

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

解决方案是将.pem拆分为正确的文件.crt和.key以及apt-get成功连接。

TLDR:.pem文件拆分为.crt.key ,它将起作用。