Como obter o ID da extensão do Chrome para desenvolvimento

Embora semelhante a essa pergunta , não estou perguntando:

Em que condições o ID de uma extensão é alterado?

nem

Como posso carregar meu arquivo zip no painel do Chrome?

No entanto, estou perguntando como posso obter a chave de uma extensão sem usar o Painel do Chrome. Portanto, não considero isso uma duplicata dessa pergunta SO .

A documentação para usar o Google Identity dentro de uma extensão do Google Chrome declara a necessidade de copiar a chave de uma extensão para seu arquivo de manifesto.

Para manter o ID do aplicativo constante, você precisa copiar a chave no manifest.json instalado para o manifesto de origem.

No entanto, ao navegar para o diretório recomendado (… Google/Chrome/Default/Extensions ) não vejo o ID da minha extensão descompactada. Eu sei que isso acontece porque a extensão não foi instalada como arquivo .crx . No entanto, a documentação está claramente escrita para fins de desenvolvimento :

Copie a chave no manifest.json instalado para o manifesto de origem, para que o ID do aplicativo permaneça constante durante o desenvolvimento .

Como posso evitar o empacotamento de minha extensão e a reinstalação toda vez que faço uma alteração? Se minha extensão de desenvolvimento não tiver nenhum arquivo de manifesto instalado do qual eu possa obter a chave da extensão, de onde posso obtê-la?

A maneira mais fácil de obter um ID de extensão é gerar o arquivo .pem e extrair o ID de extensão usando as etapas descritas nesta resposta (leia a parte abaixo da imagem).

Se você deseja gerar o ID de extensão somente com ferramentas de linha de comando , procure mais. Eu vou usar o OpenSSL porque é multi-plataforma.

Primeiro, geramos uma chave privada. Mantenha esta chave privada em segredo e não a perca. Caso contrário, você não poderá criar um arquivo CRX com o mesmo ID de extensão. A partir de agora, as chaves privadas geradas pelo Chrome são chaves RSA de 2048 bits no formato PKCS # 8 ( 1024 bits até 2013 ). Ao longo da resposta, vou me referir a este arquivo de chave privada como key.pem , porque a Chrome Web Store espera que a chave privada seja chamada key.pem .

Em segundo lugar, mostro como gerar o valor para o campo "key" do arquivo de manifesto . Esta é apenas a chave pública, codificada no formato base64.

O terceiro comando na minha resposta mostra como calcular o ID de extensão com uma chave pública (derivada de uma chave privada).

Linux / Mac

O OpenSSL está instalado na maioria das distros do Linux. Se não, basta instalar o openssl através do seu gerenciador de pacotes favorito.

 # Create private key called key.pem 2>/dev/null openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out key.pem # Generate string to be used as "key" in manifest.json (outputs to stdout) 2>/dev/null openssl rsa -in key.pem -pubout -outform DER | openssl base64 -A # Calculate extension ID (outputs to stdout) 2>/dev/null openssl rsa -in key.pem -pubout -outform DER | shasum -a 256 | head -c32 | tr 0-9a-f ap 

Eu coloquei 2>/dev/null no início de cada linha para evitar que a “gravação da chave RSA” fosse enviada para o console.

janelas

Se você não tiver o OpenSSL, poderá obter um binário pré-compilado a partir desse espelho .

 @echo off :: Assuming that you have installed OpenSSL in this directory SET PATH=%PATH%;C:\OpenSSL-Win32\bin :: Create private key called key.pem 2>NUL openssl genrsa -out priv.tmp 2048 2>NUL openssl pkcs8 -topk8 -in priv.tmp -nocrypt -out key.pem del priv.tmp :: Generate string to be used as "key" in manifest.json 2>NUL openssl rsa -in key.pem -pubout -outform DER -out pub.tmp 2>NUL openssl base64 -A -in pub.tmp del pub.tmp :: Calculate extension ID 2>NUL openssl rsa -in key.pem -pubout -outform DER -out pub.tmp 2>NUL openssl dgst -sha256 -out checksum.tmp pub.tmp SET /p EXTID= 

Eu coloquei 2>NUL no início de cada linha com o comando openssl para esconder um aviso inofensivo sobre um arquivo de configuração ausente.

Exemplos

Aqui está um exemplo de execução dos comandos anteriores no Linux. A saída relevante dos comandos está em negrito. O primeiro comando cria um arquivo, portanto não há saída visível no shell. Observe que a saída do segundo e terceiro comando não termina com uma quebra de linha, portanto há um "$" no final da linha (que não deve ser copiado).

  $ # Cria uma chave privada chamada key.pem
 $ 2> / dev / null openssl genrsa 2048 |  openssl pkcs8 -topk8 -nocrypt -out key.pem
 $ # Gera string para ser usada como "chave" no manifest.json (saídas para stdout)
 $ 2> / dev / null openssl rsa -em key.pem -pubout -outform DER |  openssl base64 -A
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8vj7SK0NZ6ak7K6m6KEAkfGaNfKUahqFFms6W8rq + voaW7nETrpsMqNyhmBQ + ea0KkyI / S5XIrDQPqDcNpvesYlg9lsmi7CQBZjJw7zNqKkvn0oYaP4SNtWZfZopBumqFbzFi5cst2PT + XU9CBitxXNtocRtcjOsa44W1gPA5xanmtlF258N6Nann + rSOAdhIWqSo / J6fj72cxTNfmqLkwAvhdS4Zyux4F87vxp4YTSwElfYXFsHZWi7h66uuuMzqyOyJz5grhCJ24rtTshMQUCxQWyhO2XT2J1tVfUN1YVw6xdKUz3aGyKZeXCuql5klHmlqE9PTlbKj / 1VMiIgCQIDAQAB $ 
 $ # Calcular ID de extensão (saídas para stdout)
 $ 2> / dev / null openssl rsa -em key.pem -pubout -outform DER |  sha256sum |  cabeça -c32 |  tr 0-9a-f ap
 mfabfdnimhipcapcioneheloaehhoggk $ 
 $ cat key.pem # Mostra o conteúdo do key.pem para completar este demo
 ----- INICIAR CHAVE PRIVADA -----
 MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDy + PtIrQ1npqTs
 rqbooQCR8Zo18pRqGoUWazpbyur6 + hpbucROumwyo3KGYFD55rQqTIj9LlcisNA +
 oNw2m96xiWD2WyaLsJAFmMnDvM2oqS + fShho / hI21Zl9mikG6aoVvMWLlyy3Y9P5
 dT0IGK3Fc22hxG1yM6xrjhbWA8DnFqea2UXbnw3o1qef6tI4B2EhapKj8np + PvZz
 FM1 + aouTAC + F1LhnK7HgXzu / GnhhNLASV9hcWwdlaLuHrq664zOrI7InPmCuEInb
 iu1OyExBQLFBbKE7ZdPYnW1V9Q3VhXDrF0pTPdobIpl5cK6qXmSUeaWoT09OVsqP
 / VUyIiAJAgMBAAECggEAIztFPKmTOwdn / MXqf + rwqTjuUopFSQllaPXNdYf8AL6J
 Wema9IuFquYWcjO / Ki1wzH1ik8vHaMlYuOwcYnLBnN69x5s6AKFukNEx2IclDyLR
 O / jDh13oCDl600KqVk1Fk3dW8cHPAxyfnRmJ6wWhFPOC3yUbdabWhpYI66mJrDhN
 ZpN04RmH7DIlhlBpvq / OMVodhRtqb4 / EVJYghTxUsrsv / I + 3t3zl / o / c0DiOjiVZ
 pEBYzn0rrHP8BAEhJWagGNgvotHPaVKAjoYcUiOUtMM4P1Js034XKjP4MHE1pMbN
 VlVnQMz3 / 6CXFL + wU1QqfohdChmcnc4QwM + vCFK47QKBgQD / FjHxhCJco0rNqNua
 B0inGx2Jfb4b + FWwLyNobaYey11o0MjpkpAvYcfe3zW8DQtmepDxGL8CpORoWtFg
 sVnmhAir0I6bxdZLMwKcp4T + kHW3n / ae3z8tPvMvclCnARGEp + ccyDH9X2iyaSd5
 8DeJ6ND32 + yr + vLgyyK / JW1z5wKBgQDz167cLe + xoRUqlKdJq8lzmij30lGVUT2D
 5Fn + 2YUKIMeVEM7PlEmu9UmpN5HMA + LSNeiMZ1uhW5YQovXlXZCWoRqieeI4LMoM
 M335hsAWpS8pFRdlXMy885w5FUC5v4Ji0RUI37WON6fxNd8zFVqAMOcAANg716RI
 MWfblCJOjwKBgQDV8BKBIbYEBfv10poja9p2NFqodqpcIQIU2uQScGvzxdIY14q5
 wu9kndiYxpH1nuch0sf / PSbuG8do8kpKk1P37mKrXyZL5TgeJ7EYG7OCITxpfiLE
 Ci6dTv98mp6kAlRj8sH1tL2gaEWR5Hl0XpDl / DpOtsefUcAj4prIv6Y1nwKBgGUk
 obNSmonjdxQidQFp8DWzTCr / Yje9ava6UVoUf8qjriV2w1H3AFlCBTvbgO5O7laj
 ZcJXXPqhMq3T6ospNEBGsvWR + PO0IFrPQQGvkx3Rhq5TwVCaHZKCudozppVlin / S
 mhcENBq5mz / CSMK3qMJjhm3J6 + dmmw4W8C10VIahAoGARf4zus0TQIxRlix1Oaaz
 sM5yANLcLivoeJDVOlUFUWgeSUc6Yma8T / FYlAkEVyyK + / nCWNErTS2yOzXEff01
 n8F0h1DJ4K5zxt0OhGUIUAGgR / kqpub0omqTJcJndLv2qgzofwK21Uih6yQzDeus
 lJsf3m3tuax5kcmhnDojbtE =
 ----- FIM CHAVE PRIVADA ----- 

A maneira mais fácil que encontrei para fazer isso é empacotando a extensão do Chrome no modo de desenvolvimento.

Para empacotar uma extensão:

Abra a página de gerenciamento de extensões acessando esta URL: chrome: // extensions

Verifique se a checkbox de seleção “Modo de desenvolvedor” no canto superior direito está marcada. Clique no botão Pack extension . Uma checkbox de diálogo é exibida.

No campo Diretório raiz da extensão, especifique o caminho para a pasta da extensão – por exemplo, ~/mytodosextension . (Ignore o outro campo; você não especifica um arquivo de chave privada na primeira vez que você empacota uma extensão específica.)

Clique em pacote . O empacotador cria dois arquivos:

  • um arquivo .crx, que é a extensão real que pode ser instalada,

  • e um arquivo .pem, que contém a chave privada.

Veja a documentação do chrome aqui