У меня есть Angular PWA, размещенный в Firebase, и у меня есть служба загрузки Spring, с которой я пытаюсь связаться (в данный момент работает локально).
Firebase по доброте душевной автоматически создает SSL-сертификат для размещенного приложения, поэтому оно безопасно и доступно только через HTTPS.
Чего я не могу понять, так это того, как настроить мою службу загрузки Spring, чтобы принимать/доверять/разрешать эти соединения, чтобы PWA мог, например, выполнять базовые вызовы REST (мне вообще нужно это делать?).
Моей первой мыслью было добавить сертификат из Firebase в хранилище доверенных сертификатов Spring, но либо я делаю это неправильно, либо это неправильный подход, поскольку я просто получаю javax.net.ssl.SSLHandshakeException: no cipher suites in common со всем, что пробовал.
Команды, которые я использовал для этого, следующие:
Загрузите сертификат с URL-адреса приложения Angular.
keytool -printcert -sslserver app.example.com:443 -rfc > temp.cert
Создайте доверенное хранилище из этого сертификата
keytool -keystore truststore.jks -alias example.com -import -file temp.cert
Затем я просто загружаю это в свой загрузочный файл Spring application.yml.
server:
port: 8443
ssl:
key-store: classpath:truststore.jks
key-password: secret
key-alias: example.com
Я не совсем уверен, сделал ли я это совершенно неправильно или пропустил важный шаг.
К сожалению, этот подход не будет работать, но может и не потребоваться.
Как вы, наверное, знаете, SSL работает с «криптографией с открытым ключом», для которой требуются два ключа: закрытый ключ и открытый ключ. SSL-сертификат — это, по сути, открытый ключ плюс некоторая другая проверочная информация.
Хотя мы можем извлечь SSL-сертификат с помощью keytool, как это сделали вы, это не даст нам ключевого закрытый ключ. И по соображениям безопасности, скорее всего, нет возможности экспортировать закрытый ключ из Firebase.
Так что же можно сделать?
Если вы просто тестируете локально, то либо просто используйте обычный HTTP (без безопасности, но вам также не нужно ничего делать) — либо используйте самозаверяющий сертификат. При использовании самозаверяющего сертификата вам, вероятно, также потребуется добавить самозаверяющий сертификат в браузер.
Если у вас есть доменное имя для службы Spring Boot, вы можете получить SSL-сертификат бесплатно для этого домена от Let's Encrypt и настроить его для Spring Boot.
Кстати, я заметил, что вы пытались создать truststore вместо keystore. truststore на самом деле для чего-то другого (то, что мы называем клиент-взаимная-аутентификация) — вероятно, это не то, что вам нужно. См. этот предыдущий поток для получения дополнительной информации.
Я пришел сюда, чтобы посмотреть, чего делать нельзя. Благодаря вашему опыту, я планировал сделать то же самое, но не больше :)