Programmatically Install Certificate into Mozilla

后端 未结 8 2146
没有蜡笔的小新
没有蜡笔的小新 2020-11-28 20:28

Is there a way to programmatically install a certificate into mozilla? We\'re trying to script everything to eliminate deviations in environment so installing it by hand thr

8条回答
  •  孤街浪徒
    2020-11-28 20:54

    I was trying to achieve the same thing in Powershell and wrote a script to perform various functions that can be interactively selected. Of course, it's fairly easy to modify the script to automate certain things instead of provide options.

    I'm an Infrastructure guy rather than a coder/programmer, so apologies if it's a bit cumbersome (but it does work!!).

    Save the following as a PS1:

    ##################################################################################################
    #  
    # NAME: RegisterFireFoxCertificates.ps1
    #  
    # AUTHOR: Andy Pyne
    # 
    # DATE  : 22.07.2015
    #  
    # COMMENT: To provide options for listing, adding, deleting and purging
    # FireFox Certificates using Mozilla's NSS Util CertUtil
    # Source: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/tools/NSS_Tools_certutil
    #
    # NOTE: You need a copy of the NSS Util CertUtil and it's associated dll's
    # The specific files I used were:
    # 
    # certutil.exe, fort32.dll, freebl3.dll, libnspr4.dll, libplc4.dll, libplds4.dll, nspr4.dll, 
    # nss3.dll, nssckbi.dll, nssdbm3.dll, nssutil3.dll, plc4.dll, plds4.dll, smime3.dll, 
    # softokn3.dll, sqlite3.dll, ssl3.dll, swft32.dll
    #
    ##################################################################################################
    
    ##################################################################################################
    
    # Setup a few parameters
    $ErrorActionPreference = "Silentlycontinue"
    $ExecutionPolicyOriginal = Get-ExecutionPolicy
    $FireFoxExecutable = "C:\Program Files (x86)\Mozilla Firefox\Firefox.exe" 
    
    # This is the Firefox certificate database
    $CertDB = "Cert8.db"
    
    # The Certificate Nickname is a name you want to see on the certificates that you've imported in - so you know they were imported by this process
    # However, when you look at the certificates in Firefox, they will be listed under whatever the certificate name was when it was generated
    # So if your certificate is listed as 'Company123' when imported, it will still be called that as the Common Name, but when you click to view
    # it, you will see that the first item in the Certificate Fields is what you 'nicknamed' it.
    $CertificateNickname = "MyCompanyName FF AutoImport Cert"
    
    # The Legacy Certificates are specific/explicit certificates which you wish to delete (The 'purge' option later in the script references these items)
    $LegacyCertificates = @("OldCertificate1", "Company Cert XYZ", "Previous Company name", "Unwanted Certificate - 7", "123APTEST123")
    
    # This is the list of databases / Firefox profiles on the machine
    $FFDBList = @()
    
    # Making sure our temporary directory is empty
    $FFCertLocationLocal = "C:\FFCertTemp"
    
    # The remote location of the certificates and 
    $FFCertLocationRemote = "\\myUNC\NETLOGON\FireFoxCert\"
    
    # The local CertUtil executable (this is copied from the remote location above)
    $FFCertTool = "$FFCertLocationLocal\CertUtil.exe"
    
    # Making sure our temporary directory is empty
    Remove-Item $FFCertLocationLocal -Recurse
    New-Item -ItemType Directory -Path $FFCertLocationLocal
    
    ##################################################################################################
    
    ##################################################################################################
    
    
    Clear
    
    # We're going to get a list of the Firefox processes on the machine that are open and close them
    # Otherwise the add/delete parts might not be successful with Firefox still running
    $FireFoxRunningProcessesList = Get-Process | Where-Object {$_.Name -Match "FireFox"} | Select-Object ProcessName,Id | Format-Table -AutoSize
    $FireFoxRunningProcesses = Get-Process | Where-Object {$_.Name -Match "FireFox"} | Select-Object -ExpandProperty Id
    If (!$FireFoxRunningProcesses) {}
    Else {
    Write-Host "The following processes will be stopped to perform certificate manipulation:"
    $FireFoxRunningProcessesList
    $TerminateProcessQuestion = Read-Host "To auto-terminate (ungracefully!) processes, press 'Y', otherwise, press any other key"
    If ($TerminateProcessQuestion -ne 'y') {
    Clear
    Write-Host "Cannot continue as Firefox process is still running, ending script ..."
    Exit} 
    Else {ForEach ($FireFoxRunningProcess in $FireFoxRunningProcesses) {
    [Int]$FireFoxRunningProcess = [Convert]::ToInt32($FireFoxRunningProcess, 10)
    Stop-Process -Id $FireFoxRunningProcess -Force}}
    }
    
    ##################################################################################################
    
    ##################################################################################################
    
    # The remote files (certificates and the NSS Tools CertUtil files are copied locally)
    $FFCertificateListItemRemote = Get-ChildItem $FFCertLocationRemote -Recurse -Include *.cer,*.dll,certutil.exe
    ForEach ($FFCertificateItemRemote in $FFCertificateListItemRemote) {
    Copy-Item $FFCertificateItemRemote.FullName -Destination $FFCertLocationLocal}
    
    # Get a list of the local certificates
    $FFCertificateListLocal = Get-ChildItem $FFCertLocationLocal -Recurse -filter *.cer
    
    Clear
    Set-ExecutionPolicy "Unrestricted"
    
    # Find all Firefox profiles and create an array called FFDBList
    # Of course, you'll only be able to get to the ones your permissions allow
    $LocalProfiles = Get-ChildItem "C:\Users" | Select-Object -ExpandProperty FullName
    ForEach ($LocalProfile in $LocalProfiles) {
    $FFProfile = Get-ChildItem "$LocalProfile\AppData\Roaming\Mozilla\Firefox\Profiles" | Select-Object -ExpandProperty FullName
    If (!$FFProfile) {Write-Host "There is no Firefox Profile for $LocalProfile"}
    ELSE {$FFDBList += $FFProfile}
    }
    
    Clear
    Write-Host "#################################"
    Write-Host "The List of FireFox Profiles is:"
    Write-Host "#################################"
    $FFDBList
    PAUSE
    
    ##################################################################################################
    
    ##################################################################################################
    
    # Setup 4x functions (List, Delete, Add and Purge)
    #
    # - List will simply list certificates from the Firefox profiles
    #
    # - Delete will delete the certificates the same as the certificates you're going to add back in
    #   So for example, if you have 2x certificates copied earlier for import, 'CompanyA' and 'CompanyZ'
    #   then you can delete certificates with these names beforehand. This will prevent the 
    #   certificates you want to import being skipped/duplicated because they already exist
    #
    # - Add will simply add the list of certificates you've copied locally
    #
    # - Purge will allow you to delete 'other' certificates that you've manually listed in the
    #   variable '$LegacyCertificates' at the top of the script
    
    # Each of the functions perform the same 4x basic steps
    #
    # 1) Do the following 3x things for each of the Firefox profiles
    # 2) Do the 2x following things for each of the certificates
    # 3) Generate an expression using parameters based on the certificate nickname specified
    #    earlier, and the profile and certificate informaiton
    # 4) Invoke the expression
    
    Function ListCertificates {
    Write-Host "#############################"
    ForEach ($FFDBItem in $FFDBList) {
    $FFCertificateListItemFull = $FFCertificateListItem.FullName
    Write-Host "Listing Certificates for $FFDBitem"
    $ExpressionToListCerts = "$FFCertTool -L -d `"$FFDBItem`""
    Invoke-Expression $ExpressionToListCerts
    }
    PAUSE}
    
    Function DeleteOldCertificates {
    Write-Host "#############################"
    ForEach ($FFDBItem in $FFDBList) {
    ForEach ($FFCertificateListItem in $FFCertificateListLocal) {
    $FFCertificateListItemFull = $FFCertificateListItem.FullName
    Write-Host "Deleting Cert $FFCertificateListItem for $FFDBitem"
    $ExpressionToDeleteCerts = "$FFCertTool -D -n `"$CertificateNickname`" -d `"$FFDBItem`""
    Invoke-Expression $ExpressionToDeleteCerts
    }}
    PAUSE}
    
    Function AddCertificates {
    Write-Host "#############################"
    ForEach ($FFDBItem in $FFDBList) {
    ForEach ($FFCertificateListItem in $FFCertificateListLocal) {
    $FFCertificateListItemFull = $FFCertificateListItem.FullName
    Write-Host "Adding $FFCertificateListItem Cert for $FFDBitem"
    $ExpressionToAddCerts = "$FFCertTool -A -n `"$CertificateNickname`" -t `"CT,C,C`" -d `"$FFDBItem`" -i `"$FFCertificateListItemFull`""
    Write-Host $ExpressionToAddCerts
    Invoke-Expression $ExpressionToAddCerts
    #PAUSE
    }}
    PAUSE}
    
    Function PurgeLegacyCertificates {
    Write-Host "#############################"
    ForEach ($FFDBItem in $FFDBList) {
    ForEach ($LegacyCertificateItem in $LegacyCertificates) {
    $LegacyCertificateItemFull = $LegacyCertificateItem.FullName
    Write-Host "Purging Old Certs ($LegacyCertificateItem) for $FFDBitem"
    #$ExpressionToDeleteLegacyCerts = "$FFCertTool -D -n `"$OldCertificate`" -d `"$FFDBItem`""
    $ExpressionToDeleteLegacyCerts = "$FFCertTool -D -n `"$LegacyCertificateItem`" -d `"$FFDBItem`""
    ForEach ($LegacyCertificate in $LegacyCertificates) {
    Invoke-Expression $ExpressionToDeleteLegacyCerts}
    }}
    PAUSE}
    
    ##################################################################################################
    
    ##################################################################################################
    
        # Creating a few options to invoke the various functions created above
    
    $CertificateAction = ""
    
    Function CertificateActionSelection {
    Do {
    Clear
    $CertificateAction = Read-Host "Would you like to [L]ist all certificates [D]elete all old certificates, [A]dd new certificates, or [P]urge legacy certificates?"
    } Until ($CertificateAction -eq "L" -or $CertificateAction -eq "D" -or $CertificateAction -eq "A" -or $CertificateAction -eq "P" )
    
    If ($CertificateAction -eq "L") {ListCertificates}
    If ($CertificateAction -eq "D") {DeleteOldCertificates}
    If ($CertificateAction -eq "A") {AddCertificates}
    If ($CertificateAction -eq "P") {PurgeLegacyCertificates}
    }
    
    Do {
    Clear
    $MoreCertificateActions = Read-Host "Would you like to [L]aunch Firefox (as $env:USERNAME), take a [C]ertificate action, or [Q]uit?"
    If ($MoreCertificateActions -eq "L") {
    Invoke-Item $FireFoxExecutable
    Exit}
    If ($MoreCertificateActions -eq "C") {CertificateActionSelection}
    
    } Until ($MoreCertificateActions -eq "Q")
    
    Remove-Item $FFCertLocationLocal -Recurse
    Set-ExecutionPolicy $ExecutionPolicyOriginal
    
    Exit
    

提交回复
热议问题