Saltar al contenido

Necesita ayuda para configurar Google Cloud Directory Sync con AD mediante LDAP seguro

Este grupo de trabajo ha estado por horas buscando soluciones a tu duda, te regalamos la respuesta por esto deseamos servirte de mucha apoyo.

Solución:

Actualización 23 de septiembre de 2020

Hoy actualicé GCDS y las cosas de TLS se rompieron nuevamente. Esta vez, el problema fue la imposibilidad de acceder a nuestro archivo CRL desde una CA raíz fuera de línea. Descubrí que Google ha reforzado su página de ayuda para problemas de certificados GCDS aquí: https://support.google.com/a/answer/3075991 Encontré mi solución allí.

Actualización 20 de enero de 2020:

Se anticipa que con los parches de marzo de 2020, Microsoft no permitirá los enlaces inseguros. Es probable que esta respuesta reciba más atención, ya que es probable que Google Cloud Directory Sync no se conecte a AD a menos que se utilice TLS.

Respuesta original

Google Cloud Directory Sync es una aplicación de Java. El instalador de GCDS instala una versión del entorno de ejecución de Java en una subcarpeta. Esa instalación tiene su propio conjunto de autoridades de certificación raíz de confianza. No utiliza los certificados instalados en Windows.

Para que todo funcione, debe importar el certificado público de la Autoridad de certificación de confianza que emitió el certificado que está utilizando su controlador de dominio. En su lugar, puede instalar el certificado público de su controlador de dominio, pero es probable que ese certificado caduque mucho antes que el certificado de la autoridad de certificación emisora.

Google proporciona instrucciones aquí: https://support.google.com/a/answer/3075991?hl=en Sin embargo, sus instrucciones utilizan el certificado público de DC, no el certificado de CA.

Obtenga el certificado de CA. Lo voy a llamar the_cert.cer

Si sigue las instrucciones de Google, está exportando el certificado desde el controlador de dominio:

certutil -store My DomainController %TEMP%the_cert.cer

Pero de nuevo, está mejor con el certificado CA.

Mueva el certificado al host de GCDS.

En el host de GCDS

Cambie las carpetas a la carpeta jre donde está instalado GCDS. Para mi fue:

cd "c:Program FilesGoogle Cloud Directory Syncjre"

El suyo puede ser diferente según su entorno.

Instale el certificado en el almacén de claves de Java:

binkeytool -keystore libsecuritycacerts -storepass changeit -import -file %TEMP%the_cert.cer -alias pick_a_name_you_like

los keytool la utilidad le indicará: Trust this certificate? [no]: Escriba sí y presione el Enter key.

Limpiar:

del the_cert.cer

Ahora, yendo en contra de mi consejo nuevamente y usando el certificado de DC, aquí hay un script completo que puede ejecutar a través del Programador de tareas para mantener su certificado actualizado en su controlador de dominio, suponiendo que ejecute GCDS en el mismo controlador de dominio.

<#
  .SYNOPSIS
  Exports the bound AD LDAPS encryption certificate and imports it into
  Google Cloud Directory Sync's Java keystore, so that GCDS syncs will succeed.

  .DESCRIPTION
  Google Cloud Directory Sync runs on Java. Java maintains its own trusted keystore,
  separate from the host operating system. Often, this keystore grows stale when updates
  are neglected. Further, the keystore would never contain certificate information for
  self-signed or internally-distributed certificates.

  In order to make GCDS work with TLS using secure LDAPS binding, it is necessary to
  export your trusted certificate from the machine's certificate store and import it into
  the GCDS-bundled Java Runtime Environment's certificate store.

  This script assumes the DC being contacted resides on the same host as the GCDS installation.

  Given a ComputerName and Port, this script will connect to the named DC and determine the
  thumbprint of the certificate bound to the DC on the specific port.

  Using this thumbprint, the script then exports the certificate from the Local Computer's MY (Personal)
  certificate store. This does NOT include the private key, and therefore it's safe to do this.

  Next, the script deletes and re-imports the certificate into the JRE certificate store.

  .PARAMETER ComputerName
  Use the fully-qualified network name of the machine. We're assuming this is the same network name
  that will be used in GCDS to bind against the DC, and is also the CommonName represented in the certificate.

  .PARAMETER Port
  Usually this will be 636, but could be custom depending on your environment.

  .OUTPUTS
  Will list the thumbprint of the cert found and will show stderr and stdout of the keytool commands.
  Error handling could definitely be beefed up here.

  .EXAMPLE
  C:PS> .Update-JavaDomainControllerCertificate.ps1 -ComputerName my.domain.com -Port 636

#>

[CmdletBinding()]
param (
    [Parameter(Mandatory=$true)]
    [string]
    $ComputerName,

    [int]
    $Port = 636
)
$FilePath = "$($Env:TEMP)adcert.crt"
$Certificate = $null
$TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
try 

    $TcpClient.Connect($ComputerName, $Port)
    $TcpStream = $TcpClient.GetStream()

    $Callback =  param($sender, $cert, $chain, $errors) return $true 

    $SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback)
    try 

        $SslStream.AuthenticateAsClient('')
        $Certificate = $SslStream.RemoteCertificate

     finally 
        $SslStream.Dispose()
    

 finally 
    $TcpClient.Dispose()


if ($Certificate) 
    if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) 
        $Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate
    
    Write-Output "Found Certificate:"
    Write-Output $Certificate


Export-Certificate -Cert $Certificate -Force -FilePath $FilePath | Out-Null

Set-Location -Path "C:Program FilesGoogle Cloud Directory Syncjre"

# Delete existing entry
& .binkeytool -keystore libsecuritycacerts -storepass changeit -delete -noprompt -alias $ComputerName 2>&1 | % "$_" 

# Add entry
& .binkeytool -keystore libsecuritycacerts -storepass changeit -importcert -noprompt -file $FilePath -alias $ComputerName 2>&1 | % "$_" 

Remove-Item -Path $FilePath -Force

Si para ti ha sido de utilidad este artículo, nos gustaría que lo compartas con más desarrolladores de esta forma contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *