(ctx *cli.Context)
| 182 | } |
| 183 | |
| 184 | func inspectAction(ctx *cli.Context) error { |
| 185 | if err := errs.MinMaxNumberOfArguments(ctx, 0, 1); err != nil { |
| 186 | return err |
| 187 | } |
| 188 | |
| 189 | var ( |
| 190 | crtFile = ctx.Args().Get(0) |
| 191 | bundle = ctx.Bool("bundle") |
| 192 | format = ctx.String("format") |
| 193 | roots = ctx.String("roots") |
| 194 | serverName = ctx.String("servername") |
| 195 | short = ctx.Bool("short") |
| 196 | insecure = ctx.Bool("insecure") |
| 197 | ) |
| 198 | |
| 199 | // Use stdin if no argument is used. |
| 200 | if crtFile == "" { |
| 201 | crtFile = "-" |
| 202 | } |
| 203 | |
| 204 | if format != "text" && format != "json" && format != "pem" { |
| 205 | return errs.InvalidFlagValue(ctx, "format", format, "text, json, pem") |
| 206 | } |
| 207 | if short && (format == "json" || format == "pem") { |
| 208 | return errs.IncompatibleFlagWithFlag(ctx, "short", "format "+format) |
| 209 | } |
| 210 | |
| 211 | switch addr, isURL, err := trimURL(crtFile); { |
| 212 | case err != nil: |
| 213 | return err |
| 214 | case isURL: |
| 215 | peerCertificates, err := getPeerCertificates(addr, serverName, roots, insecure) |
| 216 | if err != nil { |
| 217 | return err |
| 218 | } |
| 219 | if bundle { |
| 220 | return inspectCertificates(ctx, peerCertificates, os.Stdout) |
| 221 | } |
| 222 | return inspectCertificates(ctx, peerCertificates[:1], os.Stdout) |
| 223 | default: // is not URL |
| 224 | b, err := utils.ReadFile(crtFile) |
| 225 | if err != nil { |
| 226 | return errors.Wrapf(err, "error reading file %s", crtFile) |
| 227 | } |
| 228 | |
| 229 | var pemError *pemutil.InvalidPEMError |
| 230 | crts, err := pemutil.ParseCertificateBundle(b) |
| 231 | switch { |
| 232 | case errors.As(err, &pemError) && pemError.Type == pemutil.PEMTypeCertificate: |
| 233 | csr, err := pemutil.ParseCertificateRequest(b) |
| 234 | if err != nil { |
| 235 | return errors.Errorf("file %s does not contain any valid CERTIFICATE or CERTIFICATE REQUEST blocks", crtFile) |
| 236 | } |
| 237 | return inspectCertificateRequest(ctx, csr, os.Stdout) |
| 238 | case err != nil: |
| 239 | return fmt.Errorf("error parsing %s: %w", crtFile, err) |
| 240 | default: |
| 241 | if bundle { |
nothing calls this directly
no test coverage detected
searching dependent graphs…