首页 > 其他分享 >使用dependency-check-maven对项目进行漏洞检查

使用dependency-check-maven对项目进行漏洞检查

时间:2022-08-31 09:56:26浏览次数:100  
标签:java chain System maven dependency println new check out

最近,公司安排对所开发项目进行漏洞检查,使用的就是开源扫描工具 OWASP Dependency-Check。使用方式有多种,鉴于项目是用maven进行管理的,我使用的是maven插件的方式,使用方式很简单,把大象装冰箱总共分3步,这里使用maven插件只需2步即可。

1、.在pom.xml增加dependency-check-maven插件的配置,如下:

             <plugin>
                <groupId>org.owasp</groupId>
                <artifactId>dependency-check-maven</artifactId>
                <version>5.2.4</version>
                <configuration>
                    <autoUpdate>true</autoUpdate>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

2、在idea中双击图中位置允许即可,扫描结束之后会在target目录下生成一个html格式的扫描报告dependency-check-report.html

 

 

下边是扫描结束生成报告的位置

 

 

  以上两步如果顺利,就会生成上图的扫描报告,但是扫描过程中需要下载漏洞包,有的小伙伴因为网速或其他原因导致下载失败,扫描失败,应该会报如下错误:

 

 这是因为访问https地址没有对应证书的原因,我们可以通过一段代码生成对应证书然后进行尝试。生成证书的代码如下:

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
import java.io.*;
import java.net.URL;
 
import java.security.*;
import java.security.cert.*;
 
import javax.net.ssl.*;
 
public class InstallCert {
 
    public static void main(String[] args) throws Exception {
    String host;
    int port;
    char[] passphrase;
    if ((args.length == 1) || (args.length == 2)) {
        String[] c = args[0].split(":");
        host = c[0];
        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
        String p = (args.length == 1) ? "changeit" : args[1];
        passphrase = p.toCharArray();
    } else {
        System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
        return;
    }
 
    File file = new File("jssecacerts");
    if (file.isFile() == false) {
        char SEP = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + SEP
            + "lib" + SEP + "security");
        file = new File(dir, "jssecacerts");
        if (file.isFile() == false) {
        file = new File(dir, "cacerts");
        }
    }
    System.out.println("Loading KeyStore " + file + "...");
    InputStream in = new FileInputStream(file);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(in, passphrase);
    in.close();
 
    SSLContext context = SSLContext.getInstance("TLS");
    TrustManagerFactory tmf =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
    SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
    context.init(null, new TrustManager[] {tm}, null);
    SSLSocketFactory factory = context.getSocketFactory();
 
    System.out.println("Opening connection to " + host + ":" + port + "...");
    SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
    socket.setSoTimeout(10000);
    try {
        System.out.println("Starting SSL handshake...");
        socket.startHandshake();
        socket.close();
        System.out.println();
        System.out.println("No errors, certificate is already trusted");
    } catch (SSLException e) {
        System.out.println();
        e.printStackTrace(System.out);
    }
 
    X509Certificate[] chain = tm.chain;
    if (chain == null) {
        System.out.println("Could not obtain server certificate chain");
        return;
    }
 
    BufferedReader reader =
        new BufferedReader(new InputStreamReader(System.in));
 
    System.out.println();
    System.out.println("Server sent " + chain.length + " certificate(s):");
    System.out.println();
    MessageDigest sha1 = MessageDigest.getInstance("SHA1");
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = chain[i];
        System.out.println
            (" " + (i + 1) + " Subject " + cert.getSubjectDN());
        System.out.println("   Issuer  " + cert.getIssuerDN());
        sha1.update(cert.getEncoded());
        System.out.println("   sha1    " + toHexString(sha1.digest()));
        md5.update(cert.getEncoded());
        System.out.println("   md5     " + toHexString(md5.digest()));
        System.out.println();
    }
 
    System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
    String line = reader.readLine().trim();
    int k;
    try {
        k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
    } catch (NumberFormatException e) {
        System.out.println("KeyStore not changed");
        return;
    }
 
    X509Certificate cert = chain[k];
    String alias = host + "-" + (k + 1);
    ks.setCertificateEntry(alias, cert);
 
    OutputStream out = new FileOutputStream("jssecacerts");
    ks.store(out, passphrase);
    out.close();
 
    System.out.println();
    System.out.println(cert);
    System.out.println();
    System.out.println
        ("Added certificate to keystore 'jssecacerts' using alias '"
        + alias + "'");
    }
 
    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
 
    private static String toHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 3);
    for (int b : bytes) {
        b &= 0xff;
        sb.append(HEXDIGITS[b >> 4]);
        sb.append(HEXDIGITS[b & 15]);
        sb.append(' ');
    }
    return sb.toString();
    }
 
    private static class SavingTrustManager implements X509TrustManager {
 
    private final X509TrustManager tm;
    private X509Certificate[] chain;
 
    SavingTrustManager(X509TrustManager tm) {
        this.tm = tm;
    }
 
    public X509Certificate[] getAcceptedIssuers() {
        throw new UnsupportedOperationException();
    }
 
    public void checkClientTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        throw new UnsupportedOperationException();
    }
 
    public void checkServerTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        this.chain = chain;
        tm.checkServerTrusted(chain, authType);
    }
    }
 
}

1、可将以上代码复制粘贴到一个java文件InstallCert.java中,运行javac InstallCert.java,会编译对应class文件,然后运行java InstallCert +要访问的域名,比如我要访问的漏洞地址是https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-modified.meta,就可以运行java InstallCert nvd.nist.gov 即可,运行结果如图:

 

 

 接着输入1,就能在当前目录中生成一个jssecacerts证书,将此文件拷贝到[JAVA_HOME]\jre\lib\security目录下,然后重启编译器,再次运行最上边那个扫描插件即可。

最后,放一张生成的扫描报告的截图:

 

 转载:http://t.csdn.cn/mvSGf

标签:java,chain,System,maven,dependency,println,new,check,out
From: https://www.cnblogs.com/guaijushi/p/16641936.html

相关文章

  • vb.net DataGridViewCheckBoxColumn 自绘显示
     自定义自绘DataGridView扩展中发现CheckBox等控件显示错误,摸索了半天,总结一下片段:Case"DataGridViewCheckBoxCell"  NCell=NewDataGridViewCheckBoxC......
  • Maven找不到依赖终极解决方案
    离线网络环境中拷贝maven仓库到离线机器,使用maven加载项目,maven编译jar包找不到或者提示jar包信息不可用,现提供以下本人解决的方式,亲测可用基础解决方案常规idea的maven......
  • SpringBootDependencyInjectionTestExecutionListener
    ============================CONDITIONSEVALUATIONREPORT============================Positivematches:-----------------AopAutoConfigurationmatched:......
  • maven基本介绍与使用
    0.前言JasonVanZyl,在Java十大风云人物排行榜上或许会看到他。这兄弟是干嘛的?他就是Maven的创始人,人们都尊称他为“Maven他爸”。毋庸置疑,Jason也是一个秃顶......
  • maven
    安装aptinstallmaven查看maven版本、安装路径等信息mvn-v配置mvncd/usr/share/maven/confvimsettings.xml更新jar包mvncleaninst......
  • Docker 安装Nexus3 快速搭建Maven私有仓库
    #查询镜像sudodockersearchsonatype/nexus3#拉取镜像last即可sudodockerpullsonatype/nexus3#创建挂载目录-可自定义sudomkdir-p/home/admin/nexus/data......
  • idea新建Maven项目,新建的module无法创建package
    idea新建Maven项目,新建的module无法创建package问题描述图解决问题方法原因:java文件并不是SourcesRoot,需设置成SourcesRoot步骤(图更详细):右键java文件——>点击Mar......
  • maven 加载顺序
    转载 http://uoften.com/article/216374.html概述本文主要是关于Maven仓库加载顺序的实例解析和相关实例 Maven仓库一般分为本地仓库和远程仓库。远程仓库又分为私......
  • #1030 - Got error 176 "Read page with wrong checksum" from storage engine Aria
    从数据库列表中选择mysql。在表格列表中,勾选“db”旁边的框。滚动到页面底部,在显示“已选择”的选择框中,向下滚动至并选择“修复表”,然后选择“执行”。 ......
  • maven工具篇
    Maven安装和核心概念一、maven安装maven官方地址介绍了一下maven需要安装的环境,比如说:操作系统、jdk版本要求(maven是基于java编写的)、内存情况等等。然后就是修改环......