Как установить SSL-сертификат в веб-фреймворке Vapor?
Я хочу установить SSL(подстановочный сертификат Comodo, например: "*.test.com") в веб-инфраструктуру Vapor. Полученный файл "servers.json":
{
"default": {
"port": "$PORT:443",
"host": "api.test.com",
"securityLayer": "tls",
"tls": {
"certificates": "chain",
"certificateFile": "/path/ssl-bundle.crt",
"chainFile": "/path/ssl-bundle.crt",
"privateKeyFile": "/path/key.pem",
"signature": "signedFile",
"caCertificateFile": "/path/AddTrustExternalCARoot.crt"
}
}
}
Я уже убедился, что "открытый / закрытый" ключ совпадает уже с помощью команды openssl. А что касается части CertificateFile, такой как "ssl-bundle.crt", я также пробовал "*.test.com.crt" с помощью "key.pem" (все еще проходить проверку с использованием openssl, единственное отличие - тест Сертификат.com, другой - пакетный сертификат, объединенный уже правильными заказами.). Кроме того, все сертификаты и формат ключа также верны. И я также проверяю правильность расположения файлов сертификатов / ключей, чтобы Vapor мог найти эти файлы. Но я все еще не могу правильно запустить сервер и всегда отображаю ошибку. Я пытаюсь найти точное местоположение в xcode, но я вижу только, что это терпит неудачу в этом методе: "tls_accept_fds()", который находится в tls_server.c библиотеки CLibreSSL.
Кроме того, я увидел сообщение об ошибке, которое мне показывал xcode:
После использования режима отладки для трассировки, я могу только знать, что кажется, что программа выдает ошибку в "SSL_set_rfd()" или "SSL_set_rfd()", но я точно не знаю. Xcode только показывает это мне, и я не могу найти другие сообщения об ошибках в консоли отладки. В результате, пока я могу только убедиться, что ошибка должна быть в этом блоке:
int
tls_accept_fds(struct tls *ctx, struct tls **cctx, int fd_read, int fd_write)
{
struct tls *conn_ctx = NULL;
// I pass this block
if ((ctx->flags & TLS_SERVER) == 0) {
tls_set_errorx(ctx, "not a server context");
goto err;
}
// I pass this block
if ((conn_ctx = tls_server_conn(ctx)) == NULL) {
tls_set_errorx(ctx, "connection context failure");
goto err;
}
// I pass this block
if ((conn_ctx->ssl_conn = SSL_new(ctx->ssl_ctx)) == NULL) {
tls_set_errorx(ctx, "ssl failure");
goto err;
}
// I pass this block
if (SSL_set_app_data(conn_ctx->ssl_conn, conn_ctx) != 1) {
tls_set_errorx(ctx, "ssl application data failure");
goto err;
}
// The error occurs here, in SSL_set_rfd or SSL_set_wfd, it will then go to err part: "*cctx = NULL;", not even go into the if block.
if (SSL_set_rfd(conn_ctx->ssl_conn, fd_read) != 1 ||
SSL_set_wfd(conn_ctx->ssl_conn, fd_write) != 1) {
tls_set_errorx(ctx, "ssl file descriptor failure");
goto err;
}
*cctx = conn_ctx;
return (0);
err:
tls_free(conn_ctx);
*cctx = NULL;
return (-1);
}
Итак, вышеизложенное - это вся информация, которую я получил прямо сейчас, и я не могу найти решение в Интернете уже несколько дней... Может кто-нибудь подсказать мне, как установить SSL в веб-фреймворке Vapor? Я уже могу правильно установить SSL в Apache, Nginx, Tomcat и т. Д. Но никогда не получится добиться успеха в Vapor, это похоже на проблему с библиотекой C, но я не знаю реальной причины, по которой она не работает, большое спасибо за любую возможную помощь.
1 ответ
Ошибка была найдена и исправлена здесь: https://github.com/vapor/tls/pull/27