Extrai uma chave pública armazenada num dispositivo HSM para um arquivo.
Sintaxe
HSMGetKeyFile( < cHSMPath >, < cFile >, [ cPass ], [ lChangeCase ], [ lClient ] )
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência |
---|---|---|---|---|
cHSMPath | character | Indica o caminho no dispositivo HSM para o certificado de cliente. | X | |
cFile | character | Indica o caminho de destino da chave pública, incluindo o nome do arquivo. | X | |
cPass | character | Indica a senha do slot onde está armazenado o certificado apontado por cHSMPath. | ||
lChangeCase | logical | Se verdadeiro (.T.), nomes de arquivos e pastas serão convertidos para letras minúsculas; caso contrário, falso (.F.), não será feito nenhum ajuste no nome do arquivo informado. Valor padrão (.T.). | ||
lClient | logical | Indica se o dispositivo HSM está na máquina do SmartClient. |
Retorno
Nome | Tipo | Descrição |
---|---|---|
lRet | logical | Retorna .T. caso consiga extrair a chave pública do HSM; caso contrário, retorna .F.. |
Observações
- O formato aceito no caminho do parâmetro cHSMPath é "slot_<num>-id_<idhex>" ou "slot_<nem>-label_<label>", onde <num> é o número do slot, igual ao índice 1 do valor retornado pela função HSMSlotList, <idhex> é o id do objeto em hexadecimal (igual ao índice 4 do valor retornado pela função HSMObjList), sendo cada 2 caracteres a representação hexadecimal de um caractere da tabela ASCII, e <label> é igual ao índice 1 do valor retornado pela função HSMObjList.
- Caso o HSM esteja instalado na mesma máquina onde o AppServer está em execução, o parâmetro cFile deve apontar para um path no mesmo servidor. Caso esteja instalado na mesma máquina onde o SmartClient foi executado, este parâmetro deve receber um path da mesma estação.
- O valor padrão do parâmetro lChangeCase é .T..
- O parâmetro opcional lChangeCase foi criado para ampliar o suporte a Sistemas Operacionais que são Case Sensitive, assim como Linux e Mac. Quando este parâmetro for informado, terá prioridade sobre comportamento de Case Sensitive definido pelas chaves de configuração CASESENSITIVE ou SERVERTYPE. Porém, quando não especificado, seu comportamento fica condicionado ao que está configurado nessas chaves.
- Em ambiente Windows, os nomes de arquivos e pastas não possuem diferenciação entre maiúsculo e minúsculo, logo, a função conseguirá tratar os arquivos e pastas independente do valor definido no parâmetro lChangeCase.
- Quando o SmartClient utilizado for uma build nativa Linux ou Mac, sabe-se que sistema de arquivos destas plataformas não têm unidade de disco, a nomenclatura dos arquivos é case sensitive (letras minúsculas diferente de maiúsculas), e as barras separadoras de diretório / pasta são barras normais "/" ao invés de barras inversas "\". Mesmo nestes casos, deve-se especificar uma letra de unidade de disco no diretório de destino; pois quando o SmartClient em Linux e/ou Mac receber o diretório de destino, com a unidade de disco especificada, a unidade de disco será ignorada e as barras serão internamente invertidas. Por exemplo, a cópia especificando o path de destino "C:\USER\LOCAL\TEMP\" será interpretado pelo SmartClient Linux e/ou Mac como "/user/local/temp/".
- O valor padrão do parâmtero lClient é .F..
Exemplos
user function teste() Local aSlots := {} Local aObjs := {} Local nI := 0 Local nJ := 0 Local nSlots := 0 Local nObjs := 0 Local cPath := "" Local cDest := "" Local cPass := "" // define o password utilizado para acessar o HSM cPass := "1234" // inicializa o HSM if HSMInitialize() <= 0 conout( "HSM not initialized" ) return endif // pega a lista de slots do HSM aSlots := HSMSlotList() nSlots := Len( aSlots ) // para cada um dos slots for nI := 1 to nSlots // verifica se o slot está inicializado if aSlots[nI][4] == .T. ASize( aObjs, 0 ) // pega a lista de objetos do slot aObjs := HSMObjList( aSlots[nI][1], cPass ) nObjs := Len( aObjs ) // para cada objeto do slot for nJ := 1 to nObjs // verifica se é o objeto não é chave privada // o certificado e a chave pública ficam juntos if aObjs[nJ][2] == .F. // monta o caminho do objeto no HSM cPath := "slot_" + cValToChar( aSlots[nI][1] ) + "-label_" + aObjs[nJ][1] // monta o caminho de destino cDest := "\cert-slot_" + cValToChar( aSlots[nI][1] ) + "-obj_" + cValToChar( nJ ) + ".pem" // pega a chave pública no HSM if HSMGetKeyFile( cPath, cDest, cPass ) == .F. conout( "Could not get public key for certificate on " + cPath ) endif endif next nJ endif next nI if HSMFinalize() <> 1 conout( "HSM not finalized" ) endif return