Uso de múltiples claves públicas SSH

97

Tengo una cuenta personal y una cuenta de empresa en Unfuddle. En Unfuddle, las claves SSH solo se pueden usar en una sola cuenta, por lo que necesito crear una clave SSH separada en mi computadora portátil para ambas cuentas. Corrí ssh-keygen -t rsapara generar dos claves con nombres diferentes (personal es el nombre predeterminado y la compañía es {compañía} _rsa). El problema ahora es que parece que mi clave predeterminada se usa en todas partes y no puedo descubrir cómo especificar una clave para usar en Git para repositorios individuales.

Entonces, mi pregunta es: ¿Cómo especifico una clave SSH para usar de una base a otra?

Configuré mi ssh_config (~ / .ssh / config) pero todavía no parece funcionar.

config:

Host {personalaccount}.unfuddle.com
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/id_rsa

Host {companyaccount}.unfuddle.com
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/cage_rsa

Mi archivo de configuración de repositorio de Git para un repositorio en la cuenta de desempaque de mi empresa se ve así:

[remote "origin"]
     url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
     fetch = +refs/heads/*:refs/remotes/origin/*

Por lo tanto, no estoy seguro de si hay algún problema con mi configuración ssh o mi configuración git.

Dave Long
fuente
Su configuración ssh se ve bien, estoy usando una configuración similar.
Paŭlo Ebermann

Respuestas:

109

Si tiene un agente ssh activo que tiene su id_rsaclave cargada, entonces es probable que ssh ofrezca esa clave primero. Unfuddle probablemente lo acepta para la autenticación (por ejemplo, en sshd ), pero lo rechaza por autorización para acceder a los repositorios de la compañía (por ejemplo, en cualquier software interno que utilicen para la autorización, posiblemente algo similar a Gitolite). Quizás haya una manera de agregar su clave personal a la cuenta de la empresa (varias personas no comparten los mismos corp_rsaarchivos de clave pública y privada, ¿ verdad ?).


La IdentitiesOnly .ssh/configpalabra clave de configuración se puede usar para limitar las claves que ssh ofrece al sshd remoto solo a las especificadas a través de IdentityFilepalabras clave (es decir, se negará a usar cualquier clave adicional que se cargue en un agente ssh activo ).

Prueba estas .ssh/configsecciones:

Host {personalaccount}.unfuddle.com
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host {companyaccount}.unfuddle.com
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Luego, use URL de Git como estas:

git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git

Si desea aprovechar al máximo el .ssh/configmecanismo, puede proporcionar su propio nombre de host personalizado y cambiar el nombre de usuario predeterminado:

Host uf-mine
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host uf-comp
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Luego, use URL de Git como estas:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
Chris Johnsen
fuente
77
Si tiene varias cuentas en el mismo subdominio Unfuddle (con diferentes claves SSH), deberá usar el segundo método.
leolobato
Identidades Solo fue esencial para mí en mi configuración de gitolita, ¡gracias!
Koen
1
Impresionante, esto soluciona el problema de que todas mis claves se envían a github. Sin embargo, en OS X tengo que escribir mi frase de contraseña cada vez. ¿Hay alguna manera de decir solo usar la clave especificada en la configuración pero continuar usando el agente ssh?
Drew
1
@Drew: Si la clave ya está cargada en el agente, el comando aún debería extraerla del agente. ¿Estás seguro de que tu clave está precargada? Consulte ssh-add -lantes de usar su alias de host Git. Además, el archivo de clave pública debe estar presente para que ssh pueda reconocer la clave que ssh-agent está almacenando. Puede regenerar un .pubarchivo perdido con un comando como ssh-keygen -f blah -y > blah.pub.
Chris Johnsen
Sí, está ahí. Cuando eliminé la llamada IdentitiesOnly, envía github 4 claves diferentes (incluida la correcta sin preguntar la frase de contraseña). Cuando agrego la llamada, solo envía una clave, pero solicita la frase de contraseña cada vez. Incluso cuando le digo a OSX que almacene el valor de la frase de contraseña en su llavero.
Drew
3

man ssh_config

Algo como

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

Y úsalo personal_repocomo anfitrión en tu repositorio de git.

Reactormonk
fuente
Tass, ¿podrías revisar mis cambios realizados anteriormente? Agregué mi ssh_config y mi git config.
Hostes solo un identificador, no es necesario un nombre de dominio completo. Eso probablemente crea algunos errores ocultos. Si cambia eso, no necesita deletrear el nombre completo en su configuración de git.
para gitorious, user = git y host gitorious.org: por ejemplo [email protected]: ~ revelut / qt / bruce-sandbox-qt.git ¿Cómo empareja en su host una parte de la url? (típicamente ~ revelut para mí)
@Tass, así que si le doy el nombre company_unfuddle a la configuración SSH, ¿mi URL debe ser git @ company_unfuddle: {company} /overall.git? @Bruce - No estoy seguro de lo que estás preguntando. ¿Podrías expandirte un poco más?
3

IdentityFile e IdentitiesSolo funcionan bien. Lo que me molesta es tener que recordar usar diferentes nombres de host para conectarme, y el hecho de que la conexión del agente reenviado todavía contiene todas las claves, lo que significa que si el host remoto se ve comprometido, pueden usar cualquiera de mis identidades mientras estoy en .

Recientemente comencé a usar:

https://github.com/ccontavalli/ssh-ident

Es una envoltura alrededor de SSH:

  • mantiene un agente completamente separado para cada identidad que defina.
  • comparte automáticamente agentes en las sesiones de inicio de sesión, nada que hacer en su .bashrc.
  • carga el agente y las claves correspondientes a pedido la primera vez que las necesita.
  • determina qué agente usar según la línea de comandos ssh (nombre de host y tal) o su directorio de trabajo actual. Esto es particularmente útil ya que tiendo a trabajar desde diferentes caminos dependiendo de lo que estoy haciendo.
MarkMo
fuente
0

Aquí hay una manera adecuada si desea utilizar el agente ssh:

# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-add -L | grep personal > ~/.ssh/personal_identity.pub
ssh-add -L | grep company > ~/.ssh/company_identity.pub


# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
  IdentityFile ~/.ssh/personal_identity.pub

Host {companyaccount}.unfuddle.com
  IdentityFile ~/.ssh/company_identity.pub

Explicación: si tiene una clave privada en su directorio ~ / .ssh, no se utilizará ssh-agent. Entonces creamos una clave pública con otro nombre, para que ssh se vea obligado a usar ssh-agent. Esto también ayuda si no tiene acceso a claves privadas (por ejemplo, reenvío de agente ssh)

Vanuan
fuente
esto podría ser ssh-add -L, no ssh-agent.
ives
@ives gracias, arreglado
Vanuan