Ошибка при запуске HTTPS на Node.js на Mac OSX с использованием сертификата StartSSL

Я раскалываю волосы, пытаясь заставить HTTPS-сервер работать с сертификатом StartSSL. Я получил от них все необходимые файлы и использую их, передав их в аргументы createServer:

var options =
{
    ca:     FS.readFileSync('sub.class1.server.ca.pem'),
    key:    FS.readFileSync('ssl.key'),
    cert:   FS.readFileSync('ssl.crt')
};

И это ошибка, которую я получил.

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
    at Object.createCredentials (crypto.js:87:31)
    at HTTPSServer.Server (tls.js:914:28)
    at HTTPSServer.Server (https.js:33:14)
    at HTTPSServer.HTTPSServer (/Users/myUserName/node_modules/connect/lib/https.js:34:16)
    at new HTTPSServer (/Users/myUserName/node_modules/express/lib/https.js:38:23)
    at Object.createServer (/Users/myUserName/node_modules/express/lib/express.js:43:12)
    at Object.<anonymous> (/Users/myUserName/Sites/node.js/https/app.js:12:36)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:31)

Я подумал, может быть, мне нужно преобразовать сертификат в PEM. Но работает:

openssl x509 -in ssl.crt -out ssl.der -outform DER

... дает мне аналогичную ошибку

unable to load certificate
67304:error:0906D06C:PEM routines:PEM_read_bio:no start line:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/pem/pem_lib.c:648:Expecting: TRUSTED CERTIFICATE

Любая идея, почему?

ОБНОВЛЕНИЕ: Это происходит только в OSX. Я попытался запустить то же самое на сервере Ubuntu, и он работает.

Ответ 1

У меня была такая же проблема. однако я могу подтвердить, что на моей машине (macbook osx 10.7.3) node https теперь работает без ошибок с использованием самозаверяющего сертификата.

эта конкретная ошибка означает, что она либо не может найти файлы, либо ничего в файлах (вы можете подтвердить это, передав пустую строку или используя недопустимый путь к файлу.)

во-первых, попробуйте использовать абсолютные пути - например. FS.readFileSync(__ dirname + 'ssl.crt').

также откройте свои файлы сертификатов и ключей и подтвердите, что они содержат данные в форме: "----- BEGIN"... и т.д.

также отмечают, что в то время как ваши файлы являются .cert и .key файлами, документация относится к файлам сертификатов и ключей с расширением .pem.

http://nodejs.org/api/https.html

от того, что я понимаю, нет большой разницы, содержимое кажется мне очень похожим, но это может быть неудобно.

Вот команда для преобразования файла .csr в файл .pem:

openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

взято из http://silas.sewell.org/blog/2010/06/03/node-js-https-ssl-server-example/

Ответ 2

Я думаю, что вы следовали этой статье https://tootallnate.net/setting-up-free-ssl-on-your-node-server, как и я, и у меня такая же проблема, как и у вас. Но, проверяя несколько раз все файлы, которые я извлек из StartCom, я обнаружил, что я случайно сохранил сертификат и закрытый ключ как UTF8, а не ANSI. После изменения кодировки файлов в ANSI, node.js начал работать как шарм:)