Cómo habilitar el cifrado en el proyector JetBrains

El proyector es una forma de ejecutar IntelliJ IDEA en un servidor remoto. Recientemente escribí un artículo sobre esto , pero guardé silencio sobre algo importante para cualquier paranoico: cifrar datos en un socket web.



Generar y configurar claves es un trabajo bastante aburrido. Aquí tendrá que familiarizarse con las características de Docker y la criptografía en Java. Desafortunadamente, no puedes escapar de esto, porque esto es Java, y los chicos de JetBrains no tienen la culpa.



En el artículo original, este texto estaba cubierto con un spoiler, pero luego sentí que era imposible leer tal muro de texto y di a luz a este texto. Lo siento de antemano. Al abrir este artículo, acepta que no le gustará lo que ve.



Generando claves



Primero, necesitamos generar un conjunto de claves. Para hacer esto, necesita instalar OpenJDK y usar la herramienta keytool.



Generar claves es un montón de pasos. Escribí un guión para mí y le insto a que lo use.



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


, . , : ca.crt server.jks.



  • ca.crt — Certificate Authority, . .
  • 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





, https://hostname:8887 , . , " " - . , .





Configurar una conexión segura es largo y frustrante. Debe escribir muchos comandos en la consola que no se pueden memorizar de memoria, rebuscar en los archivos Docker, transferir archivos a un dispositivo móvil. Si cometió un error en alguna parte de al menos una letra, entonces nada funciona.



Por otro lado, lo hice una vez, y vivir en paz.




All Articles