Comment activer le cryptage dans JetBrains Projector

Le projecteur est un moyen d'exécuter IntelliJ IDEA sur un serveur distant. J'ai récemment écrit un article à ce sujet , mais je suis resté silencieux sur une chose importante pour tout paranoïaque - crypter des données sur une socket Web.



Générer et définir des clés est un travail plutôt morne. Ici, vous devrez vous familiariser avec les fonctionnalités de Docker et de la cryptographie en Java. Malheureusement, vous ne pouvez pas vous en sortir, car c'est Java et les gars de JetBrains ne sont pas du tout à blâmer.



Dans l'article original, ce texte était couvert d'un spoiler, mais j'ai alors senti qu'il était impossible de lire un tel mur de texte et j'ai donné naissance à ce texte. Désolé d'avance. En ouvrant cet article, vous acceptez que vous n'aimerez pas ce que vous voyez.



Générer des clés



Tout d'abord, nous devons générer un ensemble de clés. Pour ce faire, vous devez installer OpenJDK et utiliser l'outil keytool.



La génération de clés est un tas d'étapes. J'ai écrit un script pour moi - même et je vous conseille vivement de l'utiliser.



mkdir ~/keystore
cd ~/keystore

curl https://raw.githubusercontent.com/projectile-ide/projectile-keymaker/master/projectile-keymaker --output ./keymaker

chmod 755 ./keymaker
./projectile-keymaker projector idea true IP 192.168.1.1 mypassword


Cependant, rien ne vous empêche de le faire vous-même. L'essentiel est que la sortie soit constituée de deux fichiers importants: ca.crtet server.jks.



  • ca.crtEst notre autorité de certification qui a signé les clés du serveur. Vous devrez forcer le navigateur à lui faire confiance.
  • server.jks — IDEA.




- , . .



Certificate Authority (CA), .



keytool -genkeypair -v \
  -alias ca \
  -dname "CN=myCA, OU=Development, O=myCA, L=SPB, S=SPB, C=RU" \
  -keystore ca.jks \
  -keypass:env PW \
  -storepass:env PW \
  -keyalg RSA \
  -keysize 4096 \
  -ext KeyUsage:critical="keyCertSign" \
  -ext BasicConstraints:critical="ca:true" \
  -validity 9999




: -keypass:env PW. , ( bash history), .



export PW=mypassword , bash history. .



, :



export PW=`pwgen -Bs 10 1`
echo $PW > password


:



export PW=`cat password`


, ? , , . , — . , , PW.



...



CA , - JKS, . , crt:



keytool -export -v \
  -alias ca \
  -file ca.crt \
  -keypass:env PW \
  -storepass:env PW \
  -keystore ca.jks \
  -rfc


(, ):



keytool -genkeypair -v \
  -alias server \
  -dname "CN=myServer, OU=Development, O=myServer, L=SPB, S=SPB, C=RU" \
  -keystore server.jks \
  -keypass:env PW \
  -storepass:env PW \
  -keyalg RSA \
  -keysize 2048 \
  -validity 385


, . , :



keytool -certreq -v \
  -alias server \
  -keypass:env PW \
  -storepass:env PW \
  -keystore server.jks \
  -file server.csr


CA, :



keytool -gencert -v \
  -alias ca \
  -keypass:env PW \
  -storepass:env PW \
  -keystore ca.jks \
  -infile server.csr \
  -outfile server.crt \
  -ext KeyUsage:critical="digitalSignature,keyEncipherment" \
  -ext EKU="serverAuth" \
  -ext SAN="IP:192.168.1.1" \
  -rfc


, SAN : "DNS:website.com", . "IP:192.168.1.1", . IP, , , .



, , JKS CA ( ):



keytool -import -v \
  -alias ca \
  -file ca.crt \
  -keystore server.jks \
  -storetype JKS \
  -storepass:env PW << EOF
yes
EOF


JKS:



keytool -import -v \
  -alias server \
  -file server.crt \
  -keystore server.jks \
  -storetype JKS \
  -storepass:env PW


, :



keytool -list -v \
  -keystore server.jks \
  -storepass:env PW


, . .





/home/olegchir/keystore/ssl.properties :



STORE_TYPE=JKS
FILE_PATH=/tmp/server.jks
STORE_PASSWORD=mypassword
KEY_PASSWORD=mypassword


, , , .



(/home/olegchir) , - . , , . olegchir, .



/tmp/server.jks, /home/olegchir/keystore/server.jks? , , . .



Projector, . docker run, .



, run-container.sh :



docker run --rm -p 8080:8080 -p 8887:8887 -it "$containerName" bash -c "nginx && ./run.sh"


:



  • ORG_JETBRAINS_PROJECTOR_SERVER_SSL_PROPERTIES_PATH ;
  • ORG_JETBRAINS_PROJECTOR_SERVER_HANDSHAKE_TOKEN , URL, ;
  • ( ) /tmp.


docker run --rm \
    -v /home/olegchir/keystore/ssl.properties:/tmp/ssl.properties \
    -v /home/olegchir/keystore/server.jks:/tmp/server.jks \
    --env ORG_JETBRAINS_PROJECTOR_SERVER_SSL_PROPERTIES_PATH=/tmp/ssl.properties \
    --env ORG_JETBRAINS_PROJECTOR_SERVER_HANDSHAKE_TOKEN=mypassword \
    -p 8080:8080 -p 8887:8887 -it "$containerName" bash -c "nginx && ./run.sh"


!



./run-container.sh


- . :



[INFO] :: ProjectorServer :: WebSocket SSL is enabled: /tmp/ssl.properties
[INFO] :: ProjectorServer :: Server started




ca.crt , . .



-. , .



Firefox:



  1. Privacy & Security
  2. — View Certificates
  3. Authorities
  4. Import...
  5. , .
  6. .




Chrome Windows:



  1. Privacy and security
  2. Securty
  3. Manage certificates
  4. Trusted Root Certification Authorities
  5. Import...
  6. , , Trusted Root Certification Authorities.
  7. Chrome. Windows . Chrome, , Chrome. Delete.
  8. Chrome .




Chrome Linux:



  1. Privacy and security
  2. Securty
  3. Manage certificates
  4. Authorities
  5. Import...
  6. ca.crt,
  7. , .
  8. .


Chrome Fully Kiosk Browser Android:



Android . Huawei MediaPad M5 Solid Explorer .



:



  1. Settings
  2. Security & privacy
  3. More Settings
  4. Encription and credentials
  5. Install from storage
  6. ca.crt
  7. .


, Android- , "Install from storage" , . .





: https://localhost:8080/projector/?wss&token=mypassword



: https://hostname:8080/projector/?wss&host=hostname&port=8887&token=mypassword





Si tout le reste échoue, essayez d'ouvrir l'URL https://hostname:8887et voyez ce que le navigateur écrit. Il y aura peut-être un bouton comme "faire confiance à ce serveur pour toujours" ou quelque chose comme ça. Peut-être y aura-t-il un message d'erreur explicite.



conclusions



La mise en place d'une connexion sécurisée est longue et frustrante. Vous devez taper beaucoup de commandes dans la console qui ne peuvent pas être mémorisées par cœur, fouiller dans les fichiers docker, transférer des fichiers sur un appareil mobile. Si vous avez fait une erreur quelque part dans au moins une lettre, alors rien ne fonctionne.



D'un autre côté, je l'ai fait une fois - et je vis en paix.




All Articles