Переадресую тему с Как исправить ошибку CORS?
Читать с конца, т.к. вначале обсуждается проблема с CORS, причина которой в проблеме с сертификатом.
Коротко повторю: По инструкции: https://coderoad.ru/34807073/%D0%9A%D0%B0%D0%BA-%D1%81%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D1%8B-cowboy-SSL
создал структуру подкаталогов в приложении, описанную в инструкции и все описанные сертификаты. В приложении (Erlang/OTP 23, https-сервер Cowboy), использую конечный сертификат из каталога end_cert, подключаю вот так
{cacertfile, PrivDir ++ "/ssl/end_cert/end.csr"},
{certfile, PrivDir ++ "/ssl/end_cert/end.crt"},
{keyfile, PrivDir ++ "/ssl/end_cert/end.key"}
полный код функции
%% API.
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/" , cowboy_static, {priv_file, upserver, "index.html"}},
{"/assets/[...]", cowboy_static,
{priv_dir , upserver, "assets"}},
{"/upload" , upload_handler, []}
]}
]),
PrivDir = code:priv_dir(upserver),
{ok, _} = cowboy:start_tls(https, [
{port, 8888},
{cacertfile, PrivDir ++ "/ssl/end_cert/end.csr"},
{certfile, PrivDir ++ "/ssl/end_cert/end.crt"},
{keyfile, PrivDir ++ "/ssl/end_cert/end.key"}
], #{env => #{dispatch => Dispatch}}),
upserver_sup:start_link().
в каталоге …/priv/ssl/ созданы 3 подкаталога, по вышеупомянутой инструкции. Вот, все файлы
$ ls . -R
.:
end_cert inter_ca root_ca
./end_cert:
end.crt end.csr end.key
./inter_ca:
inter.crt inter.csr inter.key inter.srl v3x509extensions.txt
./root_ca:
180d30a1.0 rootca.key rootca.pem rootca.srl
При предварительной верификации сертификата, находясь в каталоге ssl
openssl s_client -servername upserver:8888 -connect upserver:8888 -CApath root_ca -verify 5
получаю ошибку
verify depth is 5
CONNECTED(00000003)
depth=0 C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
i:C = RU, ST = State, L = City, O = Company, OU = Department, CN = inter.upserver, emailAddress = support@firma.com
---
Server certificate
-----BEGIN CERTIFICATE-----
... удалено
opV7k19LRNPAKksKqg==
-----END CERTIFICATE-----
subject=C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
issuer=C = RU, ST = State, L = City, O = Company, OU = Department, CN = inter.upserver, emailAddress = support@firma.com
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1481 bytes and written 385 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
read:errno=0
Проблемы следующие:
- Почему CONNECTED(00000003), должно быть CONNECTED(00000004) ?
- Почему везде depth=0, когда должно быть 2,1,0 ?
- Почему получаются только 2 уровня, а не три ?
- Почему на каждом уровне получаю ошибки ?
verify error:num=20:unable to get local issuer certificate
verify error:num=21:unable to verify the first certificate
No client certificate CA names sent
хотя при создании сертификатов каждого уровня использовались сертификаты предыдущего уровня и там указывались пути, точно по инструкции
Смотрите также другие выхлопы в исходном посте.
Как всё это исправить?