mirror of
				https://github.com/SSLMate/certspotter.git
				synced 2025-07-03 10:47:17 +02:00 
			
		
		
		
	Include filename of saved cert in output/script invocation
This commit is contained in:
		
							parent
							
								
									cfaf126284
								
							
						
					
					
						commit
						a79cc26570
					
				@ -65,8 +65,11 @@ func DefaultStateDir (programName string) string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func logCallback (scanner *ctwatch.Scanner, entry *ct.LogEntry) {
 | 
					func logCallback (scanner *ctwatch.Scanner, entry *ct.LogEntry) {
 | 
				
			||||||
 | 
						var certFilename string
 | 
				
			||||||
	if !*noSave {
 | 
						if !*noSave {
 | 
				
			||||||
		alreadyPresent, err := ctwatch.WriteCertRepository(filepath.Join(stateDir, "certs"), entry)
 | 
							var alreadyPresent bool
 | 
				
			||||||
 | 
							var err error
 | 
				
			||||||
 | 
							alreadyPresent, certFilename, err = ctwatch.WriteCertRepository(filepath.Join(stateDir, "certs"), entry)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Print(err)
 | 
								log.Print(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -76,12 +79,12 @@ func logCallback (scanner *ctwatch.Scanner, entry *ct.LogEntry) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if *script != "" {
 | 
						if *script != "" {
 | 
				
			||||||
		if err := ctwatch.InvokeHookScript(*script, scanner.LogUri, entry); err != nil {
 | 
							if err := ctwatch.InvokeHookScript(*script, scanner.LogUri, certFilename, entry); err != nil {
 | 
				
			||||||
			log.Print(err)
 | 
								log.Print(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		printMutex.Lock()
 | 
							printMutex.Lock()
 | 
				
			||||||
		ctwatch.DumpLogEntry(os.Stdout, scanner.LogUri, entry)
 | 
							ctwatch.DumpLogEntry(os.Stdout, scanner.LogUri, certFilename, entry)
 | 
				
			||||||
		fmt.Fprintf(os.Stdout, "\n")
 | 
							fmt.Fprintf(os.Stdout, "\n")
 | 
				
			||||||
		printMutex.Unlock()
 | 
							printMutex.Unlock()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										27
									
								
								helpers.go
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								helpers.go
									
									
									
									
									
								
							@ -194,10 +194,14 @@ func (info *certInfo) TypeFriendlyString () string {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DumpLogEntry (out io.Writer, logUri string, entry *ct.LogEntry) {
 | 
					func DumpLogEntry (out io.Writer, logUri string, filename string, entry *ct.LogEntry) {
 | 
				
			||||||
	info := makeCertInfo(entry)
 | 
						info := makeCertInfo(entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if filename == "" {
 | 
				
			||||||
		fmt.Fprintf(out, "%d @ %s:\n", entry.Index, logUri)
 | 
							fmt.Fprintf(out, "%d @ %s:\n", entry.Index, logUri)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							fmt.Fprintf(out, "%s:\n", filename)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	fmt.Fprintf(out, "\t         Type = %s\n", info.TypeFriendlyString())
 | 
						fmt.Fprintf(out, "\t         Type = %s\n", info.TypeFriendlyString())
 | 
				
			||||||
	fmt.Fprintf(out, "\t    DNS Names = %v\n", info.DnsNames)
 | 
						fmt.Fprintf(out, "\t    DNS Names = %v\n", info.DnsNames)
 | 
				
			||||||
	fmt.Fprintf(out, "\t       Pubkey = %s\n", info.PubkeyHash)
 | 
						fmt.Fprintf(out, "\t       Pubkey = %s\n", info.PubkeyHash)
 | 
				
			||||||
@ -210,7 +214,7 @@ func DumpLogEntry (out io.Writer, logUri string, entry *ct.LogEntry) {
 | 
				
			|||||||
	fmt.Fprintf(out, "\t    Not After = %s\n", info.NotAfter)
 | 
						fmt.Fprintf(out, "\t    Not After = %s\n", info.NotAfter)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func InvokeHookScript (command string, logUri string, entry *ct.LogEntry) error {
 | 
					func InvokeHookScript (command string, logUri string, filename string, entry *ct.LogEntry) error {
 | 
				
			||||||
	info := makeCertInfo(entry)
 | 
						info := makeCertInfo(entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cmd := exec.Command(command)
 | 
						cmd := exec.Command(command)
 | 
				
			||||||
@ -226,6 +230,9 @@ func InvokeHookScript (command string, logUri string, entry *ct.LogEntry) error
 | 
				
			|||||||
				"FINGERPRINT=" + info.Fingerprint,
 | 
									"FINGERPRINT=" + info.Fingerprint,
 | 
				
			||||||
				"NOT_BEFORE=" + strconv.FormatInt(info.NotBefore.Unix(), 10),
 | 
									"NOT_BEFORE=" + strconv.FormatInt(info.NotBefore.Unix(), 10),
 | 
				
			||||||
				"NOT_AFTER=" + strconv.FormatInt(info.NotAfter.Unix(), 10))
 | 
									"NOT_AFTER=" + strconv.FormatInt(info.NotAfter.Unix(), 10))
 | 
				
			||||||
 | 
						if filename != "" {
 | 
				
			||||||
 | 
							cmd.Env = append(cmd.Env, "CERT_FILENAME=" + filename)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	stderrBuffer := bytes.Buffer{}
 | 
						stderrBuffer := bytes.Buffer{}
 | 
				
			||||||
	cmd.Stderr = &stderrBuffer
 | 
						cmd.Stderr = &stderrBuffer
 | 
				
			||||||
	if err := cmd.Run(); err != nil {
 | 
						if err := cmd.Run(); err != nil {
 | 
				
			||||||
@ -238,7 +245,7 @@ func InvokeHookScript (command string, logUri string, entry *ct.LogEntry) error
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func WriteCertRepository (repoPath string, entry *ct.LogEntry) (bool, error) {
 | 
					func WriteCertRepository (repoPath string, entry *ct.LogEntry) (bool, string, error) {
 | 
				
			||||||
	fingerprint := sha256hex(getRaw(entry))
 | 
						fingerprint := sha256hex(getRaw(entry))
 | 
				
			||||||
	prefixPath := filepath.Join(repoPath, fingerprint[0:2])
 | 
						prefixPath := filepath.Join(repoPath, fingerprint[0:2])
 | 
				
			||||||
	var filenameSuffix string
 | 
						var filenameSuffix string
 | 
				
			||||||
@ -248,30 +255,30 @@ func WriteCertRepository (repoPath string, entry *ct.LogEntry) (bool, error) {
 | 
				
			|||||||
		filenameSuffix = ".cert.pem"
 | 
							filenameSuffix = ".cert.pem"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := os.Mkdir(prefixPath, 0777); err != nil && !os.IsExist(err) {
 | 
						if err := os.Mkdir(prefixPath, 0777); err != nil && !os.IsExist(err) {
 | 
				
			||||||
		return false, fmt.Errorf("Failed to create prefix directory %s: %s", prefixPath, err)
 | 
							return false, "", fmt.Errorf("Failed to create prefix directory %s: %s", prefixPath, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	path := filepath.Join(prefixPath, fingerprint + filenameSuffix)
 | 
						path := filepath.Join(prefixPath, fingerprint + filenameSuffix)
 | 
				
			||||||
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666)
 | 
						file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if os.IsExist(err) {
 | 
							if os.IsExist(err) {
 | 
				
			||||||
			return true, nil
 | 
								return true, path, nil
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			return false, fmt.Errorf("Failed to open %s for writing: %s", path, err)
 | 
								return false, path, fmt.Errorf("Failed to open %s for writing: %s", path, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: getRaw(entry)}); err != nil {
 | 
						if err := pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: getRaw(entry)}); err != nil {
 | 
				
			||||||
		file.Close()
 | 
							file.Close()
 | 
				
			||||||
		return false, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
							return false, path, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, chainCert := range entry.Chain {
 | 
						for _, chainCert := range entry.Chain {
 | 
				
			||||||
		if err := pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: chainCert}); err != nil {
 | 
							if err := pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: chainCert}); err != nil {
 | 
				
			||||||
			file.Close()
 | 
								file.Close()
 | 
				
			||||||
			return false, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
								return false, path, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := file.Close(); err != nil {
 | 
						if err := file.Close(); err != nil {
 | 
				
			||||||
		return false, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
							return false, path, fmt.Errorf("Error writing to %s: %s", path, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return false, nil
 | 
						return false, path, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user