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?
- Existe um evento para quando um pop-up de extensão do Chrome é fechado?
- Iniciar um aplicativo externo de uma extensão do Google Chrome?
- Obtenha o JSON em uma extensão do Chrome
- Verificar se o usuário tem uma extensão do Chrome instalada
- Código de extensão do Chrome vs scripts de conteúdo vs scripts injetados
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).
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.
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.
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