精华内容
下载资源
问答
  • License

    千次阅读 2009-09-11 18:33:00
    Crucible 100 Users: Evaluation ...License: MOnOnSiMamttWwUKRCnGUlHcMppGERuJJtgjqEDFfjnFtS mi2KqFVkC4mt4wMLKApz9CHY2KNbkD226V5VtPmChAd OrrpuTnOonMmoRomMQpvSqmpqnPRrmNmopTuwVWWwTvVQM ...
    Crucible 100 Users: Evaluation huawei 11 十月 2009 Request Support
    Server ID:
    A739-FRUQ-UNFK-35I0
     
    License:

    Usage: Copy and paste the above key into the SysInfo page in the Crucible Administration section.

    Actions: Buy
    FishEye 100 Users: Evaluation huawei 11 十月 2009 Request Support
    Server ID:
    A739-FRUQ-UNFK-35I0
     
    License:

    Usage: Copy and paste the above key into the SysInfo page in the FishEye Administration section.

    Actions: Buy
    展开全文
  • Source Insight 4.0 序列号 license文件

    万次阅读 多人点赞 2019-07-03 11:41:12
    修改license文件 打开 C:\ProgramData\Source Insight\4.0\si4.lic 将Expiration=”2017-XX-XX”中的2017修改为2030。 注意:过一段时间提示过期后,把Date="2019-10-24 00:00:00",改成前一天的,又能继续使用。 ...

    安装程序下载

    官网上下载Source Insight 4.0的安装程序.

    目前版本4.00.0098可用

    已经分享到网盘

    链接: https://pan.baidu.com/s/1xyprwNSXLpj7kpDa7LaF_Q

    提取码: v3cy

     

    30天的试用安装

    首次启动选择授权方式,这里选择第二个选项,30天试用。

    点击下一步,输入名称、公司或组织名称、邮箱信息,申请30天的试用。
    输入完成后,点击下一步,直到安装完成。

    修改sourceinsight4.exe

    用16进制编辑器(sublime text)打开sourceinsight4.exe文件,找到c800 0000 742a 83bc 2408 这一段,修改74 为 eb。

    修改license文件

    打开 C:\ProgramData\Source Insight\4.0\si4.lic
    将Expiration=”2017-XX-XX”中的2017修改为2030。

    注意:过一段时间提示过期后,把Date="2019-10-24 00:00:00",改成前一天的,又能继续使用。

    启动界面如下:

     

     

    展开全文
  • ArcGIS许可管理器License server administrator无法启动的解决方法在安装ArcGIS软件,甚至日常使用启动软件时,ArcGIS许可管理器License Manager经常会无法启动,点多少次都没反应,更别谈往后的破解了。这里谈一下...

    ArcGIS许可管理器License server administrator无法启动的解决方法

    在安装ArcGIS软件,甚至日常使用启动软件时,ArcGIS许可管理器License Manager经常会无法启动,点多少次都没反应,更别谈往后的破解了。这里谈一下自己遇到问题后用过的能用的方法。

    1. 方法1:
      • 右击桌面状态栏,找到任务管理器;
      • 在任务管理器中选择“服务”选项卡;
      • 下拉列表找到ArcGIS license manager;
      • 右击选择开始;
      • 具体如图
    2. 方法2:
      • 此方法原理同第一种方法;
      • 利用windows键+R 快捷键打开“运行”窗口;
      • 输入services.msc ;
      • 找到ArcGIS Lisence Manager,选中右键启动;
    3. 方法3:
      • 找到License server administrator所在文件夹(右击图标,打开文件位置);
      • 在文件夹找到services.txt这个文件
      • services.txt
      • 将里面的计算机名改成自己的计算机名;
      • Bioko

    网上还有很多方法,关闭防火墙、重启Imgrd之类的,但就我而言只有这三种方法成功了,所以其他的不予介绍。

    展开全文
  • License校验

    千次阅读 2015-11-28 09:59:53
    license
    license
    package com.comName.dhm.common.license.tool;

    import java.io.IOException;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;

    /**
     * 生成一对密钥,即私钥和公钥
     *
     */
    public class GenerateKeyPair
    {

        /**
         * 密鈅对生成处理
         */
        public void run()
        {

            try
            {
                KeyPairGenerator keygen = KeyPairGenerator.getInstance(LicenseToolUtil.KEY_ALGORITHM);
                SecureRandom random = new SecureRandom();
                keygen.initialize(LicenseToolUtil.KEY_SIZE, random);
                KeyPair keyPair = keygen.genKeyPair();

                // 得到钥匙对
                PublicKey publicKey = keyPair.getPublic();
                PrivateKey privateKey = keyPair.getPrivate();

                // 写公钥文件
                LicenseToolUtil.writeFile(LicenseToolUtil.PUBLIC_KEY_FILE, publicKey.getEncoded());

                // 写密钥文件
                LicenseToolUtil.writeFile(LicenseToolUtil.PRIVATE_KEY_FILE, privateKey.getEncoded());

                // 完成
                System.out.println("生成密钥对成功,公钥路径【" + LicenseToolUtil.PUBLIC_KEY_FILE + "】,私钥路径【 "
                        + LicenseToolUtil.PRIVATE_KEY_FILE + "】");
            }
            catch (NoSuchAlgorithmException e)
            {
                // error异常处理
                System.err.println("生成密钥对失败:" + e.getMessage());
            }
            catch (IOException e)
            {
                // error异常处理
                System.err.println("生成密钥对失败:" + e.getMessage());
            }
        }

        /**
         * 执行入口
         *
         * @param args
         */
        public static void main(String[] args)
        {

            System.out.println("密钥对生成开始。");
            // 执行
            new GenerateKeyPair().run();
            System.out.println("密钥对生成结束。");
        }
    }

    package com.comName.dhm.common.license.tool;

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;

    /**
     * License工具的操作公用类
     *
     */
    public class LicenseToolUtil
    {

        /**
         * key的size
         */
        public final static int KEY_SIZE = 1024;

        /**
         * 加密算法
         */
        public final static String KEY_ALGORITHM = "RSA";

        /**
         * 签名算法
         */
        public static final String SIGNATURE_ALGORITHM = "MD5withRSA";

        /**
         * 公钥文件
         */
        public final static String PUBLIC_KEY_FILE = "conf/publickey.txt";

        /**
         * 私钥文件
         */
        public final static String PRIVATE_KEY_FILE = "conf/privatekey.txt";

        /**
         * signature对象的名字
         */
        public static final String SIGNATURE_NAME = "signature";

        /**
         * 读取文件内容,保存为byte数组
         *
         * @param filePath
         *            文件路径
         * @return 文件内容数据
         * @throws IOException
         */
        public static byte[] readFile(String filePath) throws IOException
        {

            // 文件名是否为空
            if (filePath == null)
            {
                System.out.println("文件名为空,不能读取数据。");
                return null;
            }

            // 构建File对象
            File file = new File(filePath);
            if (file.exists() && file.isFile())
            {
                long fileLength = file.length();
                if (fileLength > 0L)
                {
                    BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));

                    byte[] b = new byte[(int) fileLength];
                    while (fis.read(b) != -1)
                    {
                    }
                    fis.close();
                    fis = null;

                    return b;
                }
            }
            else
            {
                return null;
            }
            return null;
        }

        /**
         * 将byte数据写入写文件
         *
         * @param filePath
         *            文件路径
         * @param content
         *            byte数据
         * @throws IOException
         */
        public static void writeFile(String filePath, byte[] content) throws IOException
        {

            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(filePath));

            fos.write(content);
            fos.flush();
            fos.close();
        }

        /**
         * 将字节数组转化为十六进制
         *
         * @param theData
         *            字节数组
         * @return 十六进制数据
         */
        public static String bytesToHexString(byte[] theData)
        {
            StringBuffer hexStrBuff = new StringBuffer(theData.length * 2);

            for (int i = 0; i < theData.length; i++)
            {
                String hexByteStr = Integer.toHexString(theData[i] & 0xff).toUpperCase();
                if (hexByteStr.length() == 1)
                {
                    hexStrBuff.append("0");
                }
                hexStrBuff.append(hexByteStr);
            }

            return hexStrBuff.toString();
        }

        /**
         * 将十六进制转化为字节数组
         *
         * @param theHexString
         *            十六进制数据
         * @return 字节数组
         */
        public static byte[] hexStringToBytes(String theHexString)
        {
            byte data[] = new byte[theHexString.length() / 2];

            for (int i = 0; i < data.length; i++)
            {
                String a = theHexString.substring(i * 2, i * 2 + 2);
                data[i] = (byte) Integer.parseInt(a, 16);
            }

            return data;
        }

        /**
         * 取得文件对象的Dom对象
         *
         * @return 文件对象的Dom对象
         */
        public static Element getFileRootDocument(File xmlFile)
        {
            if (xmlFile == null || !xmlFile.exists())
            {
                return null;
            }
            try
            {
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(xmlFile);
                return doc.getRootElement();
            }
            catch (JDOMException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return null;
        }

        /**
         * 取得签名信息
         *
         * @param rootElement
         *            license的Element对象
         * @return 签名信息
         */
        public static String getSignatureSource(Element rootElement)
        {

            if (rootElement == null)
            {
                // 没有要签名的对象
                System.err.println("没有要签名的对象");
                return null;
            }
            // 要签名的信息
            StringBuffer sb = new StringBuffer();
            fetchElementLeafValue(rootElement, sb);
            return sb.toString();
        }

        /**
         * 递归取得license文件的内容
         *
         * @param element
         *            当前Element对象
         * @param sb
         *            buffer
         * @return 签名信息
         */
        private static void fetchElementLeafValue(Element element, StringBuffer sb)
        {

            if (element == null)
            {
                return;
            }
            List<?> list = element.getChildren();
            // signature对象不作为签名对象
            if (list.size() == 0 && !SIGNATURE_NAME.equalsIgnoreCase(element.getName()))
            {
                sb.append("&").append(element.getText());
            }
            // 递归调用
            for (Iterator<?> iterator = list.iterator(); iterator.hasNext();)
            {
                Element ele = (Element) iterator.next();
                fetchElementLeafValue(ele, sb);
            }

        }

        /**
         * 读取文件的第一行数据
         *
         * @param file
         *            数据文件
         * @return 第一行数据
         */
        public static String readContentFromFile(File file) throws IOException
        {

            if (file == null || !file.exists() || !file.isFile())
            {
                System.err.println("文件不存在!");
                return null;
            }

            StringBuffer tmpStr = new StringBuffer();
            InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
            char[] bf = new char[1024];
            int i = -1;
            while ((i = isr.read(bf)) != -1)
            {
                tmpStr.append(bf, 0, i);
            }
            isr.close();
            return tmpStr.toString();
        }

        /**
         * 写License文件
         *
         * @param licenseFileName
         *            license文件的名字
         * @param rootElement
         *            RootDocument对象
         * @param signature
         *            signature的值
         * @return 写文件是否成功
         */
        public static boolean writeLicenseXML(String licenseFileName, Element rootElement, String signature)
        {

            if (licenseFileName == null)
            {
                // error 文件名不能为空
                System.err.println("文件名不能为空");
                return false;
            }
            if (rootElement == null)
            {
                // error license内容对象不能为空
                System.err.println("license内容对象不能为空");
                return false;
            }

            try
            {
                // 写signature节点的值
                Element element = getElementByName(rootElement, SIGNATURE_NAME);
                if (element != null)
                {
                    element.setText(signature);
                }
                Format format = Format.getCompactFormat();
                format.setEncoding("utf-8");
                format.setIndent("    ");
                XMLOutputter XMLOut = new XMLOutputter(format);
                XMLOut.output((Document) rootElement.getParent(), new FileOutputStream(licenseFileName));
                return true;
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return false;
        }

        /**
         * 取得指定的element
         *
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element
         */
        public static Element getElementByName(Element rootElement, String name)
        {

            List<Element> target = getElementsByName(rootElement, name);

            if (target != null && target.size() > 0)
            {
                return target.get(0);
            }
            return null;

        }

        /**
         * 取得指定的element一览
         *
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element一览
         */
        public static List<Element> getElementsByName(Element rootElement, String name)
        {

            if (name == null)
            {
                // error 节点名字不能为空
                System.err.println("节点名字不能为空");
                return null;
            }
            if (rootElement == null)
            {
                // error license内容对象不能为空
                System.err.println("license内容对象不能为空");
                return null;
            }

            List<Element> target = new ArrayList<Element>();
            searchElementByName(target, rootElement, name);

            return target;

        }

        /**
         * 递归取得指定的element一览
         *
         * @param target
         *            element一览
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element一览
         */
        private static List<Element> searchElementByName(List<Element> target, Element element, String name)
        {

            List<?> eleList = element.getChildren();
            if (name.equalsIgnoreCase(element.getName()))
            {
                target.add(element);
            }
            if (eleList.size() == 0)
            {
                return target;
            }
            else
            {
                for (Iterator<?> iterator = eleList.iterator(); iterator.hasNext();)
                {
                    Element element2 = (Element) iterator.next();
                    searchElementByName(target, element2, name);
                }
            }
            return target;
        }
    }


    读取初始化license文件,生成签名license文件的处理
    package com.comName.dhm.common.license.tool;

    import java.io.File;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.Signature;
    import java.security.SignatureException;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;

    import org.jdom.Element;

    /**
     * 读取初始化license文件,生成签名license文件的处理
     *
     */
    public class GenerateLicense
    {

        /**
         * 初始化license文件
         */
        private static String orgLicenseFile = "license.xml";

        /**
         * 签名license文件
         */
        private static String licenseFile = "conf/license.xml";

        /**
         * license生成处理
         */
        public void run()
        {

            try
            {

                // 取得初始化license文件的Element对象
                Element rootElement = LicenseToolUtil.getFileRootDocument(new File(orgLicenseFile));
                // 签名信息
                String myinfo = LicenseToolUtil.getSignatureSource(rootElement);

                if (myinfo == null)
                {
                    // 异常处理
                    System.err.println("初始化license不存在,生成签名license文件生成密钥对失败。");
                    return;
                }

                // 取得私钥
                byte[] privateKey = LicenseToolUtil.readFile(LicenseToolUtil.PRIVATE_KEY_FILE);

                if (privateKey == null || privateKey.length == 0)
                {
                    System.err.println("私钥取得失败,生成签名license文件生成密钥对失败。");
                    return;
                }

                // 取得加密的key
                PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(privateKey);
                KeyFactory keyf = KeyFactory.getInstance(LicenseToolUtil.KEY_ALGORITHM);
                PrivateKey myprikey = keyf.generatePrivate(priPKCS8);

                // 用私钥对信息生成数字签名
                Signature signet = Signature.getInstance(LicenseToolUtil.SIGNATURE_ALGORITHM);
                signet.initSign(myprikey);
                signet.update(myinfo.getBytes());
                byte[] signed = signet.sign(); // 对信息的数字签名
                // 签名信息加密
                String sigStr = LicenseToolUtil.bytesToHexString(signed);

                if (LicenseToolUtil.writeLicenseXML(licenseFile, rootElement, sigStr))
                {
                    System.out.println("签名并生成文件成功,license文件的地址【" + licenseFile + "】");
                }
                else
                {
                    System.out.println("签名失败");
                }

            }
            catch (NoSuchAlgorithmException e)
            {
                e.printStackTrace();
                // 异常处理
                System.out.println("生成密钥对失败");
            }
            catch (IOException e)
            {
                e.printStackTrace();
                // 异常处理
                System.out.println("生成密钥对失败");
            }
            catch (InvalidKeySpecException e)
            {
                e.printStackTrace();
                // 异常处理
                System.out.println("生成密钥对失败");
            }
            catch (InvalidKeyException e)
            {
                e.printStackTrace();
                // 异常处理
                System.out.println("生成密钥对失败");
            }
            catch (SignatureException e)
            {
                e.printStackTrace();
                // 异常处理
                System.out.println("生成密钥对失败");
            }

        }

        /**
         * 执行入口
         *
         * @param args
         */
        public static void main(String[] args)
        {
            System.out.println("License文件生成开始。");
            // 是否传递路径
            if (args.length == 2)
            {
                orgLicenseFile = args[0];
                licenseFile = args[1];
            }
            else
            {
                System.out.println("没有指定初始化license文件与生成后license文件的路径,license文件将生成到默认路径。");
            }
            // 生成license文件
            new GenerateLicense().run();
            System.out.println("License文件生成结束。");
        }
    }

    orgLicenseFile = "license.xml";
    <?xml version="1.0" encoding="utf-8"?>
    <comName-license>
        <systemInfo>
            <name>SDP.SME.CD</name>
            <version>V300R002</version>
            <serial>61635-6786786-1334569-22342</serial>
            <ip>any</ip>
            <mac>any</mac>
            <expiration>2012-12-1 12:00:00</expiration>
            <controlLevel>1</controlLevel>
        </systemInfo>
        <controlItems>
            <controlItem>
                <name>system_user_number</name>
                <value>10000000</value>
            </controlItem>
            <controlItem>
                <name>product_offering_number</name>
                <value>10000000</value>
            </controlItem>
        </controlItems>
        <signature>260BD1C81C5A661E71EFE7CE508703B91DA481DDF35631BCAF6BEDFAAF52E53D1BC83B8461BD0F515C4EDCC23C37C58FEEAA2E0DA15BFC4BFEAFCFA371606F1450408E8F8AF7850AC4B799DCE2C7E5E54A3A1F2808A897958F50023C114BAC6C1ACF537D3782810BB23DD2CE6E16BBC275B3CA43AF882E792F1DA9E8A922D4A4</signature>
    </comName-license>
    licenseFile = "conf/license.xml";
    <?xml version="1.0" encoding="utf-8"?>
    <comName-license>
        <systemInfo>
            <name>DHM.iEPG</name>
            <version>V200R002</version>
            <serial>61635-6786786-1334569-22342</serial>
            <ip>any</ip>
            <mac>any</mac>
            <expiration>2011-12-1 12:00:00</expiration>
            <controlLevel>1</controlLevel>
        </systemInfo>
        <controlItems>
            <controlItem>
                <name>system_user_number</name>
                <value>1000</value>
            </controlItem>
            <controlItem>
                <name>product_offering_number</name>
                <value>100</value>
            </controlItem>
        </controlItems>
        <signature>3772A5EDB2E31E82368BA6D199D8C2FFD55AD56CCA670C31EA0DFABD0C0C892C4A4E035757254A35D33850ECE0ABB39F30FBDEB4C966FC1E87EB07981C694F25A929CC27CE6A6FA4EDDE4B70E341BBD9DDF219FD86D9B5205535F963272012792C7D0ED0B35312DFBC2F72F19A1796DF69F2C3FC8895348E82179F83B82EEE6D</signature>
    </comName-license>

    package com.comName.dhm.common.license;

    import java.util.Map;

    import org.apache.log4j.Logger;

    import com.comName.dhm.common.license.vo.License;
    import com.comName.dhm.common.license.vo.LicenseInfo;
    import com.comName.dhm.common.license.vo.SystemInfo;

    /**
     * License组件接口
     *
     */
    public class ControlItemCheck
    {

        /**
         * 日志对象
         */
        private static Logger logger = Logger.getLogger(ControlItemCheck.class);

        /**
         * 控制项检验<br />
         * <ol>
         * <li>控制项不存在时,FALSE
         * <li>控制项超过控制上限值且控制级别为高,FALSE
         * <li>控制项超过控制上限值但控制级别为低,TRUE
         * <li>控制项没有超过控制上限值,TRUE
         * </ol>
         *
         * @param controlName
         *            控制项目名
         * @param controlValue
         *            控制项目值
         * @return 是否合法
         */
        public static boolean checkItem(String controlName, int controlValue)
        {
       
            if (logger.isDebugEnabled())
            {
                logger.info("控制项检查开始。");
                logger.debug("控制项:【controlName:" + controlName + "】【controlValue:" + controlValue + "】");
            }

            // 获取license对象
            License license = LicenseInfo.getLicense();

            // 加载license失败或license不存在
            if (license == null || controlName == null)
            {
                logger.error("验证异常,license对象不存在或license信息加载失败。");
                return false;
            }
            // 系统信息取得
            SystemInfo sysinfo = license.getSystemInfo();
            if (sysinfo == null)
            {
                // 系统信息为空
                logger.error("验证异常,license对象的系统信息不存在。");
                return false;
            }

            // 控制级别验证
            Map<String, String> controlItems = license.getControlItems();
            String testValue = controlItems.get(controlName);
            // 控制项是否存在
            if (testValue == null)
            {
                // 没有取得控制项
                logger.error("验证异常,控制项不存在。");
                return false;
            }
            // 超过控制值
            if (controlValue > Integer.parseInt(testValue))
            {
                // 控制级别
                // 级别高
                if (sysinfo != null && "1".equals(sysinfo.getControlLevel()))
                {
                    // 超过控制值
                    if (logger.isInfoEnabled())
                    {
                        logger.info("验证不通过,超过控制值,且级别为高。");
                    }
                    return false;
                }
                // 超过控制值,但级别为低
                if (logger.isInfoEnabled())
                {
                    logger.info("超过控制值,但级别为低");
                }
            }

            // 验证成功
            if (logger.isDebugEnabled())
            {
                logger.debug("验证通过。");
            }
            return true;
        }

        /**
         * 根据控制项名字取得控制项值<br />
         *
         * @param controlName
         *            控制项目名
         * @return 控制项目值
         */
        public static int getControlValue(String controlName)
        {
            // log开始
            if (logger.isInfoEnabled())
            {
                logger.info("控制项值取得处理开始。");
            }
            if (logger.isDebugEnabled())
            {
                logger.debug("控制项:【controlName:" + controlName + "】");
            }

            int controlValue = Integer.MIN_VALUE;

            // 获取license对象
            License license = LicenseInfo.getLicense();

            // 加载license失败或license不存在
            if (license == null || controlName == null)
            {
                logger.error("验证异常,license对象不存在或license信息加载失败。");
                return controlValue;
            }

            // 控制项值取得
            Map<String, String> controlItems = license.getControlItems();
            String testValue = controlItems.get(controlName);
            // 控制项是否存在
            if (testValue == null)
            {
                // 没有取得控制项
                logger.error("验证异常,控制项不存在。");
                controlValue = Integer.MIN_VALUE;
            }
            try
            {
                controlValue = Integer.parseInt(testValue);
            }
            catch (NumberFormatException e)
            {
                logger.error("控制项值不正确。", e);
                controlValue = Integer.MIN_VALUE;
            }

            return controlValue;
        }
    }

    package com.comName.dhm.common.license.vo;

    /**
     * 保存License信息
     *
     */
    public class LicenseInfo
    {

        /**
         * License信息
         */
        private static License license;

        /**
         * 取得license
         *
         * @return license的值
         */
        public static License getLicense()
        {
            return license;
        }

        /**
         * 设置license
         *
         * @param 设置的license
         */
        public static void setLicense(License license)
        {
            LicenseInfo.license = license;
        }
    }


    package com.comName.dhm.common.license.vo;

    import java.util.Map;

    /**
     * License实体(tag名:coship-license)
     *
     */
    public class License
    {

        /**
         * 系统信息(tag名:systemInfo)
         */
        private SystemInfo systemInfo;

        /**
         * 控制项列表(tag名:controlItems)
         */
        private Map<String, String> controlItems;

        /**
         * 证书(tag名:signature)
         */
        private String signature;

        /**
         * 取得systemInfo
         *
         * @return systemInfo的值
         */
        public SystemInfo getSystemInfo()
        {
            return systemInfo;
        }

        /**
         * 设置systemInfo
         *
         * @param 设置的systemInfo
         */
        public void setSystemInfo(SystemInfo systemInfo)
        {
            this.systemInfo = systemInfo;
        }

        /**
         * 取得controlItems
         *
         * @return controlItems的值
         */
        public Map<String, String> getControlItems()
        {
            return controlItems;
        }

        /**
         * 设置controlItems
         *
         * @param 设置的controlItems
         */
        public void setControlItems(Map<String, String> controlItems)
        {
            this.controlItems = controlItems;
        }

        /**
         * 取得signature
         *
         * @return signature的值
         */
        public String getSignature()
        {
            return signature;
        }

        /**
         * 设置signature
         *
         * @param 设置的signature
         */
        public void setSignature(String signature)
        {
            this.signature = signature;
        }
    }

    package com.comName.dhm.common.license.vo;

    /**
     * 系统信息实体(tag名:systemInfo)
     *
     */
    public class SystemInfo
    {

        /**
         * 系统名(tag名:name)
         */
        private String name;

        /**
         * 系统名(tag名:version)
         */
        private String version;

        /**
         * 系统名(tag名:serial)
         */
        private String serial;

        /**
         * 系统名(tag名:ip)
         */
        private String ip;

        /**
         * 系统名(tag名:mac)
         */
        private String mac;

        /**
         * 系统名(tag名:expiration)
         */
        private String expiration;

        /**
         * 系统名(tag名:controlLevel)
         */
        private String controlLevel;

        /**
         * 取得name
         *
         * @return name的值
         */
        public String getName()
        {
            return name;
        }

        /**
         * 设置name
         *
         * @param 设置的name
         */
        public void setName(String name)
        {
            this.name = name;
        }

        /**
         * 取得version
         *
         * @return version的值
         */
        public String getVersion()
        {
            return version;
        }

        /**
         * 设置version
         *
         * @param 设置的version
         */
        public void setVersion(String version)
        {
            this.version = version;
        }

        /**
         * 取得serial
         *
         * @return serial的值
         */
        public String getSerial()
        {
            return serial;
        }

        /**
         * 设置serial
         *
         * @param 设置的serial
         */
        public void setSerial(String serial)
        {
            this.serial = serial;
        }

        /**
         * 取得ip
         *
         * @return ip的值
         */
        public String getIp()
        {
            return ip;
        }

        /**
         * 设置ip
         *
         * @param 设置的ip
         */
        public void setIp(String ip)
        {
            this.ip = ip;
        }

        /**
         * 取得mac
         *
         * @return mac的值
         */
        public String getMac()
        {
            return mac;
        }

        /**
         * 设置mac
         *
         * @param 设置的mac
         */
        public void setMac(String mac)
        {
            this.mac = mac;
        }

        /**
         * 取得expiration
         *
         * @return expiration的值
         */
        public String getExpiration()
        {
            return expiration;
        }

        /**
         * 设置expiration
         *
         * @param 设置的expiration
         */
        public void setExpiration(String expiration)
        {
            this.expiration = expiration;
        }

        /**
         * 取得controlLevel
         *
         * @return controlLevel的值
         */
        public String getControlLevel()
        {
            return controlLevel;
        }

        /**
         * 设置controlLevel
         *
         * @param 设置的controlLevel
         */
        public void setControlLevel(String controlLevel)
        {
            this.controlLevel = controlLevel;
        }
    }


    LicenseInit
    package com.comName.dhm.common.license;

    import org.apache.log4j.Logger;
    import com.comName.dhm.common.init.SystemInitiator;

    /**
     * @author
     *
     */
    public class LicenseInit
    {

        /**
         *
         */
        public LicenseInit()
        {
        }

        /**
         * 日志对象
         */
        private Logger logger = Logger.getLogger(LicenseInit.class);

        /**
         * serialId
         */
        private static final long serialVersionUID = -8345723002031989740L;

        /**
         * license文件
         */
        private String licensePath = null;

        /**
         * 公钥文件
         */
        private String publicKeyPath = null;

        /**
         * 过滤器初始化处理,取得配置参数的值
         *
         * @param config
         *            FilterConfig对象
         */
        public void init(String licenseFileName, String publicKeyFileName)
        {
            // log开始
            logger.debug("LicenseInitServlet加载开始。");

            // 获取文件分割符
            String fs = System.getProperty("file.separator");

            // 从web.xml获取参数
            String confPath = SystemInitiator.getSystemInfo().getConfPath();

            // License路径
            this.licensePath = confPath + fs + licenseFileName;

            // publicKey路径
            this.publicKeyPath = confPath + fs + publicKeyFileName;

            if (logger.isDebugEnabled())
            {
                logger.debug("licensePath:" + licensePath + ";publicKeyPath:" + publicKeyPath);
            }
            // 执行处理
            LicenseUtil.initLicense(licensePath, publicKeyPath);
        }

        public static void main(String[] args)
        {
            // 执行处理
            LicenseUtil.initLicense("F:\\workspace\\SDP.SME.CD\\SDP.SME.CD\\aaa\\conf\\common\\license.xml",
                    "F:\\workspace\\SDP.SME.CD\\SDP.SME.CD\\aaa\\conf\\common\\publickey.txt");
        }
    }


    SystemInitiator
    package com.comName.dhm.common.init;

    import javax.servlet.ServletContext;

    /**
     * @author 903939
     *
     */
    public class SystemInitiator
    {
        static private SystemInfo systemInfo = null;

        static public SystemInfo getSystemInfo()
        {
            return systemInfo;
        }

        public static void setSystemInfo(SystemInfo systemInfo)
        {

            SystemInitiator.systemInfo = systemInfo;
        }

        public static void initApp(ServletContext ctx)
        {
            // get file seperator
            String FS = System.getProperty("file.separator");

            // get system name configed in web.xml
            String systemName = ctx.getInitParameter("dhm-system-name");

            // get working dir
            String work_dir = System.getProperty("user.dir");

            // set conf path
            String confPath = work_dir + FS + systemName + FS + ctx.getInitParameter("system.config-path-name");

            // set log path
            String logPath = work_dir + FS + systemName + FS + ctx.getInitParameter("system.log-path-name");

            systemInfo = new SystemInfo(systemName, confPath, logPath);
            System.out.println(systemInfo.toString());
        }
    }

    package com.comName.dhm.common.init;

    /**
     * @author
     *
     */
    public class SystemInfo
    {
        private String systemName = null;
        private String confPath = null;
        private String logPath = null;

        public SystemInfo(String systemName, String confPath, String logPath)
        {
            this.systemName = systemName;
            this.confPath = confPath;
            this.logPath = logPath;
        }

        public String getSystemName()
        {
            return systemName;
        }

        public String getConfPath()
        {
            return confPath;
        }

        public String getLogPath()
        {
            return logPath;
        }

        public String toString()
        {
            return this.getClass().getName() + "[systemName=" + this.getSystemName() + ";confPath=" + this.getConfPath()
                    + ";logPath=" + this.getLogPath() + "]";
        }
    }


    package com.comName.dhm.common.license;

    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletException;

    import org.apache.log4j.Logger;

    import com.comName.dhm.common.init.SystemInitiator;

    /**
     * <一句话功能简述>
     * <功能详细描述>
     *
     * @author  904008
     * @version  [V200R001]
     * @date 2010-9-26
     * @see  [相关类/方法]
     * @since  [DHM.Core.IEPGM-V200R001]
     */

    /**
     * <一句话功能简述>
     * <功能详细描述>
     *
     * @author  904008
     * @version  [V200R001, 2010-9-26]
     * @see  [相关类/方法]
     * @since  [DHM.Core.IEPGM-V200R001]
     */
    public class LicenseInitListener implements ServletContextListener
    {
        /**
         * 日志对象
         */
        private static Logger logger = Logger.getLogger(LicenseInitServlet.class);

        /**
         * serialId
         */
        private static final long serialVersionUID = -8345723002031989740L;

        /**
         * license文件
         */
        private String licensePath = null;

        /**
         * 公钥文件
         */
        private String publicKeyPath = null;

        /**
         * 过滤器初始化处理,取得配置参数的值
         *
         * @param config
         *            FilterConfig对象
         * @throws ServletException
         */
        public void contextDestroyed(ServletContextEvent sce)
        {

        }

        public void contextInitialized(ServletContextEvent sce)
        {
            // log开始
            logger.debug("LicenseInitListener加载开始。");
            ServletContext ctx = sce.getServletContext();

            // 获取文件分割符
            String fs = System.getProperty("file.separator");

            // 从web.xml获取参数
            String confPath = SystemInitiator.getSystemInfo().getConfPath();
            String licenseFileName = ctx.getInitParameter("license.license-file");
            String publicKeyFileName = ctx.getInitParameter("license.public-key-file");

            // License路径
            this.licensePath = confPath + fs + licenseFileName;

            // publicKey路径
            this.publicKeyPath = confPath + fs + publicKeyFileName;

            logger.debug("licensePath:" + licensePath + ";publicKeyPath:" + publicKeyPath);
            // 执行处理
            LicenseUtil.initLicense(licensePath, publicKeyPath);

        }

    }


    package com.comName.dhm.common.license;

    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletException;

    import org.apache.log4j.Logger;

    import com.comName.dhm.common.init.SystemInitiator;

    public class LicenseInitListener implements ServletContextListener
    {
        /**
         * 日志对象
         */
        private static Logger logger = Logger.getLogger(LicenseInitServlet.class);

        /**
         * serialId
         */
        private static final long serialVersionUID = -8345723002031989740L;

        /**
         * license文件
         */
        private String licensePath = null;

        /**
         * 公钥文件
         */
        private String publicKeyPath = null;

        /**
         * 过滤器初始化处理,取得配置参数的值
         *
         * @param config
         *            FilterConfig对象
         * @throws ServletException
         */
        public void contextDestroyed(ServletContextEvent sce)
        {

        }

        public void contextInitialized(ServletContextEvent sce)
        {
            // log开始
            logger.debug("LicenseInitListener加载开始。");
            ServletContext ctx = sce.getServletContext();

            // 获取文件分割符
            String fs = System.getProperty("file.separator");

            // 从web.xml获取参数
            String confPath = SystemInitiator.getSystemInfo().getConfPath();
            String licenseFileName = ctx.getInitParameter("license.license-file");
            String publicKeyFileName = ctx.getInitParameter("license.public-key-file");

            // License路径
            this.licensePath = confPath + fs + licenseFileName;

            // publicKey路径
            this.publicKeyPath = confPath + fs + publicKeyFileName;

            logger.debug("licensePath:" + licensePath + ";publicKeyPath:" + publicKeyPath);
            // 执行处理
            LicenseUtil.initLicense(licensePath, publicKeyPath);

        }
    }

    package com.comName.dhm.common.license;

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;

    import org.apache.log4j.Logger;

    import com.comName.dhm.common.init.SystemInitiator;

    /**
     * License加载Servlet
     */
    public class LicenseInitServlet extends HttpServlet
    {

        /**
         * 日志对象
         */
        private static Logger logger = Logger.getLogger(LicenseInitServlet.class);

        /**
         * serialId
         */
        private static final long serialVersionUID = -8345723002031989740L;

        /**
         * license文件
         */
        private String licensePath = null;

        /**
         * 公钥文件
         */
        private String publicKeyPath = null;

        /**
         * 过滤器初始化处理,取得配置参数的值
         *
         * @param config
         *            FilterConfig对象
         * @throws ServletException
         */
        public void init(ServletConfig config) throws ServletException
        {
            // log开始
            logger.debug("LicenseInitServlet加载开始。");

            // 获取文件分割符
            String fs = System.getProperty("file.separator");

            // 从web.xml获取参数
            String confPath = SystemInitiator.getSystemInfo().getConfPath();
            String licenseFileName = config.getInitParameter("license-file");
            String publicKeyFileName = config.getInitParameter("public-key-file");

            // License路径
            this.licensePath = confPath + fs + licenseFileName;

            // publicKey路径
            this.publicKeyPath = confPath + fs + publicKeyFileName;

            logger.debug("licensePath:" + licensePath + ";publicKeyPath:" + publicKeyPath);
            // 执行处理
            LicenseUtil.initLicense(licensePath, publicKeyPath);
        }
    }

    package com.comName.dhm.common.license;

    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.security.KeyFactory;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.spec.X509EncodedKeySpec;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;

    import org.apache.log4j.Logger;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;

    import com.comName.dhm.common.license.vo.License;
    import com.comName.dhm.common.license.vo.LicenseInfo;
    import com.comName.dhm.common.license.vo.SystemInfo;

    /**
     * License操作公用类
     *
     */
    public class LicenseUtil
    {

        /**
         * 日志对象
         */
        private static Logger logger = Logger.getLogger(LicenseUtil.class);

        /**
         * signature对象的名字
         */
        public static final String SIGNATURE_NAME = "signature";

        /**
         * 将字节数组转化为十六进制
         *
         * @param theData
         *            字节数组
         * @return 十六进制数据
         */
        public static String bytesToHexString(byte[] theData)
        {

            StringBuffer hexStrBuff = new StringBuffer(theData.length * 2);

            for (int i = 0; i < theData.length; i++)
            {
                String hexByteStr = Integer.toHexString(theData[i] & 0xff).toUpperCase();
                if (hexByteStr.length() == 1)
                {
                    hexStrBuff.append("0");
                }
                hexStrBuff.append(hexByteStr);
            }
            return hexStrBuff.toString();
        }

        /**
         * 将十六进制转化为字节数组
         *
         * @param theHexString
         *            十六进制数据
         * @return 字节数组
         */
        public static byte[] hexStringToBytes(String theHexString)
        {
            byte data[] = new byte[theHexString.length() / 2];

            for (int i = 0; i < data.length; i++)
            {
                String a = theHexString.substring(i * 2, i * 2 + 2);
                data[i] = (byte) Integer.parseInt(a, 16);
            }
            return data;
        }

        /**
         * 取得文件对象的Dom对象
         *
         * @return 文件对象的Dom对象
         */
        public static Element getFileRootDocument(File xmlFile)
        {
            if (xmlFile == null || !xmlFile.exists())
            {
                logger.error("取得文件对象的Dom对象时,文件不存在。");
                return null;
            }
            try
            {
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(xmlFile);
                return doc.getRootElement();
            }
            catch (JDOMException e)
            {
                logger.error("取得文件对象的Dom对象异常", e);
            }
            catch (IOException e)
            {
                logger.error("取得文件对象的Dom对象异常", e);
            }
            return null;
        }

        /**
         * 读取文件内容,保存为byte数组
         *
         * @param filePath
         *            文件路径
         * @return 文件内容数据
         * @throws IOException
         */
        public static byte[] readFile(String filePath) throws IOException
        {

            // 文件名是否为空
            if (filePath == null)
            {
                logger.error("文件名为空,不能读取数据。");
                return null;
            }

            // 构建File对象
            File file = new File(filePath);
            if (file.exists() && file.isFile())
            {
                long fileLength = file.length();
                if (fileLength > 0L)
                {
                    BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));

                    byte[] b = new byte[(int) fileLength];
                    while (fis.read(b) != -1)
                    {
                    }
                    fis.close();
                    fis = null;

                    return b;
                }
            }
            else
            {
                return null;
            }
            return null;
        }

        /**
         * 读取文件的数据
         *
         * @param file
         *            数据文件
         * @return 文件的数据
         */
        public static String readContentFromFile(File file)
        {

            if (file == null || !file.exists() || !file.isFile())
            {
                logger.debug("读取文件的数据时,文件不存在。");
                return null;
            }

            StringBuffer tmpStr = new StringBuffer();
            InputStreamReader isr = null;
            try
            {
                isr = new InputStreamReader(new FileInputStream(file));

                char[] bf = new char[1024];
                int i = -1;
                while ((i = isr.read(bf)) != -1)
                {
                    tmpStr.append(bf, 0, i);
                }
                isr.close();
                return tmpStr.toString();

            }
            catch (IOException e)
            {
                e.printStackTrace();
                if (isr != null)
                {
                    try
                    {
                        isr.close();
                    }
                    catch (IOException e1)
                    {
                        e1.printStackTrace();
                    }
                }
            }
            return null;
        }

        /**
         * 取得指定的element
         *
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element
         */
        public static Element getElementByName(Element rootElement, String name)
        {

            List<Element> target = getElementsByName(rootElement, name);

            if (target != null && target.size() > 0)
            {
                return target.get(0);
            }
            return null;

        }

        /**
         * 取得指定的element一览
         *
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element一览
         */
        public static List<Element> getElementsByName(Element rootElement, String name)
        {

            if (name == null)
            {
                // 节点名字不能为空
                logger.error("取得指定的element一览时,节点名字为空。");
                return null;
            }
            if (rootElement == null)
            {
                // license内容对象不能为空
                logger.error("取得指定的element一览时,license内容对象为空。");
                return null;
            }

            List<Element> target = new ArrayList<Element>();
            searchElementByName(target, rootElement, name);

            return target;

        }

        /**
         * 递归取得指定的element一览
         *
         * @param target
         *            element一览
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element一览
         */
        private static List<Element> searchElementByName(List<Element> target, Element element, String name)
        {

            List<?> eleList = element.getChildren();
            if (name.equalsIgnoreCase(element.getName()))
            {
                target.add(element);
            }
            if (eleList.size() == 0)
            {
                return target;
            }
            else
            {
                for (Iterator<?> iterator = eleList.iterator(); iterator.hasNext();)
                {
                    Element element2 = (Element) iterator.next();
                    searchElementByName(target, element2, name);
                }
            }
            return target;
        }

        /**
         * 取得签名信息
         *
         * @param rootElement
         *            license的Element对象
         * @return 签名信息
         */
        public static String getSignatureSource(Element rootElement)
        {

            if (rootElement == null)
            {
                // TODO:error 没有要签名的对象
                logger.error("取得签名信息时,没有要签名的对象。");
                return null;
            }
            // 要签名的信息
            StringBuffer sb = new StringBuffer();
            fetchElementLeafValue(rootElement, sb);
            return sb.toString();
        }

        /**
         * 递归取得license文件的内容
         *
         * @param element
         *            当前Element对象
         * @param sb
         *            buffer
         * @return 签名信息
         */
        private static void fetchElementLeafValue(Element element, StringBuffer sb)
        {

            if (element == null)
            {
                return;
            }
            List<?> list = element.getChildren();
            // signature对象不作为签名对象
            if (list.size() == 0 && !SIGNATURE_NAME.equalsIgnoreCase(element.getName()))
            {
                sb.append("&").append(element.getText());
            }
            // 递归调用
            for (Iterator<?> iterator = list.iterator(); iterator.hasNext();)
            {
                Element ele = (Element) iterator.next();
                fetchElementLeafValue(ele, sb);
            }

        }

        /**
         * 取得License对象
         *
         * @param rootElement
         *            RootDocument对象
         * @return License对象
         */
        public static License getLicenseByXML(Element rootElement)
        {

            License license = new License();
            // SystemInfo
            SystemInfo sysInfo = new SystemInfo();
            sysInfo.setName(getElementValueByName(rootElement, "name"));
            sysInfo.setVersion(getElementValueByName(rootElement, "version"));
            sysInfo.setSerial(getElementValueByName(rootElement, "serial"));
            sysInfo.setIp(getElementValueByName(rootElement, "ip"));
            sysInfo.setMac(getElementValueByName(rootElement, "mac"));
            sysInfo.setExpiration(getElementValueByName(rootElement, "expiration"));
            sysInfo.setControlLevel(getElementValueByName(rootElement, "controlLevel"));
            license.setSystemInfo(sysInfo);

            // ControlItems
            List<Element> ciElementList = getElementsByName(rootElement, "controlItem");
            Map<String, String> ciMap = new HashMap<String, String>();
            for (Iterator<Element> iterator = ciElementList.iterator(); iterator.hasNext();)
            {
                Element element = (Element) iterator.next();
                ciMap.put(element.getChildText("name"), element.getChildText("value"));
            }
            license.setControlItems(ciMap);

            // signature
            license.setSignature(getElementValueByName(rootElement, "signature"));

            return license;
        }

        /**
         * 取得指定的element的值
         *
         * @param rootElement
         *            RootDocument对象
         * @param name
         *            节点名字
         * @return 指定的element的值
         */
        private static String getElementValueByName(Element rootElement, String name)
        {
            Element element = getElementByName(rootElement, name);
            if (element == null)
            {
                return null;
            }
            return element.getText();
        }

        /**
         * <p>
         * 方法 getLocalIp
         * </p>
         * 获取本机ip地址
         *
         * @return
         */
        public static String getLocalIp()
        {
            String localIp = null;
            try
            {
                localIp = InetAddress.getLocalHost().getHostAddress();
            }
            catch (UnknownHostException e)
            {
                // TODO:获取服务器IP地址失败!
                logger.error("获取服务器IP地址失败。", e);
            }
            return localIp;
        }

        /**
         * <p>
         * 方法 getLocalMac
         * </p>
         * 获取本机MAC地址
         *
         * @return
         */
        public static String getLocalMac()
        {
            String os = getOSName();
            String mac = null;
            try
            {
                // System.out.println(os);
                if (os.startsWith("windows"))
                {
                    // 本地是windows
                    mac = getWindowsMACAddress();
                    // System.out.println(mac);
                }
                else
                {
                    // 本地是非windows系统 一般就是unix
                    mac = getUnixMACAddress();
                    // System.out.println(mac);
                }
            }
            catch (Exception e)
            {
                // TODO:获取服务器MAC地址失败!
                logger.error("获取服务器MAC地址失败。", e);
            }
            return mac;
        }

        /**
         * 获取当前操作系统名称. return 操作系统名称 例如:windows xp,linux 等.
         */
        private static String getOSName()
        {
            return System.getProperty("os.name").toLowerCase();
        }

        /**
         * 获取unix网卡的mac地址. 非windows的系统默认调用本方法获取.如果有特殊系统请继续扩充新的取mac地址方法.
         *
         * @return mac地址
         */
        private static String getUnixMACAddress()
        {
            String mac = null;
            BufferedReader bufferedReader = null;
            Process process = null;
            try
            {
                process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令,一般取eth0作为本地主网卡
                // 显示信息中包含有mac地址信息
                bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = null;
                int index = -1;
                while ((line = bufferedReader.readLine()) != null)
                {
                    index = line.toLowerCase().indexOf("hwaddr");// 寻找标示字符串[hwaddr]
                    if (index >= 0)
                    {// 找到了
                        mac = line.substring(index + "hwaddr".length() + 1).trim();// 取出mac地址并去除2边空格
                        break;
                    }
                }
            }
            catch (IOException e)
            {
                logger.error("获取服务器MAC地址失败时,发生IO异常。", e);
            }
            finally
            {
                try
                {
                    if (bufferedReader != null)
                    {
                        bufferedReader.close();
                    }
                }
                catch (IOException e1)
                {
                    logger.error("获取服务器MAC地址失败时,发生IO异常。", e1);
                }
                bufferedReader = null;
                process = null;
            }

            return mac;
        }

        /**
         * 获取widnows网卡的mac地址.
         *
         * @return mac地址
         */
        private static String getWindowsMACAddress()
        {
            String mac = null;
            BufferedReader bufferedReader = null;
            Process process = null;
            try
            {
                process = Runtime.getRuntime().exec("ipconfig /all");// windows下的命令,显示信息中包含有mac地址信息
                bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = null;
                int index = -1;
                while ((line = bufferedReader.readLine()) != null)
                {
                    index = line.toLowerCase().indexOf("physical address");// 寻找标示字符串[physical
                    // address]
                    if (index >= 0)
                    {// 找到了
                        index = line.indexOf(":");// 寻找":"的位置
                        if (index >= 0)
                        {
                            mac = line.substring(index + 1).trim();// 取出mac地址并去除2边空格
                        }
                        break;
                    }
                }
            }
            catch (IOException e)
            {
                logger.error("获取服务器MAC地址失败时,发生IO异常。", e);
            }
            finally
            {
                try
                {
                    if (bufferedReader != null)
                    {
                        bufferedReader.close();
                    }
                }
                catch (IOException e1)
                {
                    logger.error("获取服务器MAC地址失败时,发生IO异常。", e1);
                }
                bufferedReader = null;
                process = null;
            }
            return mac;
        }

        public static void initLicense(String licensePath, String publicKeyPath)
        {
            try
            {
                // license文件不存在
                File lisenceFile = new File(licensePath);
                if (!lisenceFile.exists() || !lisenceFile.isFile())
                {
                    logger.error("License验证加载错误,系统退出。原因:License文件不存在。");
                    System.exit(1);
                    return;
                }
                // license文件不存在
                File publicKeyFile = new File(publicKeyPath);
                if (!publicKeyFile.exists() || !publicKeyFile.isFile())
                {
                    logger.error("License验证加载错误,系统退出。原因:公钥文件不存在。");
                    System.exit(1);
                    return;
                }

                // 取得License 文件的rootElement
                Element rootElement = LicenseUtil.getFileRootDocument(lisenceFile);

                // 要签名的信息
                String myinfo = LicenseUtil.getSignatureSource(rootElement);

                // Signature取得
                Element signEle = LicenseUtil.getElementByName(rootElement, LicenseUtil.SIGNATURE_NAME);
                if (signEle == null)
                {
                    logger.error("License验证加载错误,系统退出。原因:签名信息不存在。");
                    System.exit(1);
                    return;
                }
                String signStr = signEle.getText();

                // license校验
                // 这是GenerateKeyPair输出的公钥编码
                byte[] publicKey = LicenseUtil.readFile(publicKeyPath);

                if (publicKey == null || publicKey.length == 0)
                {
                    logger.error("License验证加载错误,系统退出。原因:公钥取得失败。");
                    System.exit(1);
                    return;
                }

                // 公钥验证签名
                X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(publicKey);
                KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
                byte[] signed = LicenseUtil.hexStringToBytes(signStr);// 这是SignatureData输出的数字签名
                Signature signetcheck = Signature.getInstance("MD5withRSA");
                signetcheck.initVerify(pubKey);
                signetcheck.update(myinfo.getBytes());
                License license = null;
                if (signetcheck.verify(signed))
                {
                    // 将License对象放入内存
                    logger.info("签名正常。");
                }
                else
                {
                    logger.error("License验证加载错误,系统退出。原因:签名验证失败。");
                    System.exit(1);
                    return;
                }
                license = LicenseUtil.getLicenseByXML(rootElement);
                if (license == null)
                {
                    logger.error("License验证加载错误,系统退出。原因:License对象取得失败。");
                    System.exit(1);
                    return;
                }
                SystemInfo sysinfo = license.getSystemInfo();
                // ip 检验
                String ip = sysinfo.getIp();
                String serverIp = LicenseUtil.getLocalIp();
                logger.debug("License Ip:" + ip + ";Server IP:" + serverIp);
                if (!"any".equals(ip) && !serverIp.equals(ip))
                {
                    // IP地址已经修改
                    logger.error("License验证加载错误,系统退出。IP地址已经修改。");
                    System.exit(1);
                    return;
                }

                // mac 检验
                String mac = sysinfo.getMac();
                String serverMac = LicenseUtil.getLocalMac();
                logger.debug("License Mac:" + mac + ";Server Mac:" + serverMac);
                if (!"any".equals(mac) && !serverMac.equalsIgnoreCase(mac))
                {
                    // Mac地址已经修改
                    logger.error("License验证加载错误,系统退出。Mac地址已经修改。");
                    System.exit(1);
                    return;
                }

                // 系统超时 检验
                logger.debug("License Expiration:" + sysinfo.getExpiration());
                if (!"never".equalsIgnoreCase(sysinfo.getExpiration()))
                {

                    Calendar cpCalendar = new GregorianCalendar();
                    // 日期格式:2009-1-1 12:00:00
                    SimpleDateFormat parseTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    Date expireDate;
                    try
                    {
                        expireDate = parseTime.parse(sysinfo.getExpiration());
                    }
                    catch (ParseException e)
                    {
                        // 日期格式化失败
                        logger.error("License验证加载错误,超时日期格式化失败。");
                        System.exit(1);
                        return;
                    }
                    cpCalendar.setTime(expireDate);
                    // 得到系统当前日期
                    Calendar nowCalendar = Calendar.getInstance();
                    if (nowCalendar.getTimeInMillis() > cpCalendar.getTimeInMillis())
                    {
                        // 已经过期
                        logger.error("License验证加载错误,系统退出。license已经失效。");
                        System.exit(1);
                        return;
                    }
                }
                LicenseInfo.setLicense(license);

            }
            catch (Exception e)
            {
                logger.error("License验证加载时,发生异常,系统退出。异常信息:", e);
                System.exit(1);
                return;
            }
        }
    }



    展开全文
  • License介绍

    万次阅读 2019-10-24 17:55:25
    什么是License 许多混乱就始于你不知道License到底是什么,到底有什么含义。当你对你的产品使用License时,并不意味着你放弃了任何权利,你依然对其拥有原著作权。License只是授予他们于特定权利来使用你的产品。 ...
  • license 生成license文件demo

    热门讨论 2014-07-31 13:41:57
    运行Test文件会在bin目录下生成两个license文件,一份用于客户端验证,一份公司自己留存
  • Halcon License——2021年4月license_suppot(持续更)

    万次阅读 多人点赞 2019-08-11 20:04:09
    Halcon2019年08月license: 链接:https://pan.baidu.com/s/1kpNRQ3ADp_rrBOAJR524UA 提取码:jyp9
  • WebStorm license server

    万次阅读 多人点赞 2017-04-19 11:56:46
    WebStorm license server: 2017-10-16更新: http://idea.iteblog.com/key.php 2018-01-06更新: http://idea.imsxm.com/ 【建议都试试,不行的话继续在网上爬咯】
  • 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
  • License设计

    2018-11-06 21:22:32
    What is License Management License是对软件使用的许可,可分为资源型和功能性许可。 资源型License 对软件使用数量,内存,容量,期限等使用资源的限制或许可。 功能型License 对软件的功能列表的限制或...
  • License解释

    千次阅读 2017-06-23 11:04:09
    什么是License
  • sourcetree.license

    热门讨论 2015-11-12 10:41:00
    官网注册账号:https://id.atlassian.com/signup?application=mac&continue=https://my.atlassian.com/license/sourcetree 2.导入license文件,file->Registration...->Import License 添加文件即可
  • 643个永久IP license. 11个2022年超期HLS license。1.打开Vivado License Manager(注册文件管理器) 2.点击Load License 3.将几个license文件逐一导入 4.在View License Status查看license适用版本与过期日期
  • pycharm所有版本 ...打开激活窗口 选择 Activate new license with: License server (用license server 激活) 在 License sever address 处填入 http://xidea.online or http://...
  • RTU license

    2019-10-04 05:09:56
    Right to Use (RTU) licensing is a model in which licenses are not tied to a unique device identifier (UDI), product ID, or serial number. ...Use RTU licensing to enable a desired AP license count o...
  • License Server

    千次阅读 2018-11-21 14:06:24
    选择第三个 License Server ,然后把下面的地址填进去   http://active.chinapyg.com/ 
  • vnclicense

    万次阅读 2017-12-06 16:38:17
    vnclicense -add JMWDX-GDVLM-J38L5-BKX2L-4KUTN WHJRK-UXY7V-Q34M9-CZU8L-8KGFA  S4J7A-XWXY5-KXAJW-54KRA-TP3QA  48R4P-NFZ46-NBCWY-Q2ZJT-3H9RA  NGNW9-7Q8BK-UQGY7-J3KAA-6G39  Z456C-LMKTC-NLGWQ...
  • Rational Rose License 2007 license 到期问题

    千次阅读 2020-03-26 11:32:32
    这两天需要花UML图,但是电脑里没有Rational Rose 2007,重新装了一个,遇到了license到期的现象,下面是我找到的解决方法,实测有效。 Rational Rose 2007到期解决方法 ...
  • 看QT License了解 License协议

    千次阅读 2017-09-15 17:32:37
    一直对这些License协议纠结着,自己学习自己弄弄,都不会去注意它,但和商业扯上关系,那就麻烦了。还是了解下比较好。所以,看下QT是怎么做的。 在QT的LICENSE FAQ下面这么说的 ...Qt is a commercial and open ...
  • Synopsys license过期

    千次阅读 热门讨论 2021-01-12 09:55:49
    Synopsys License过期问题解决 今年是2021年了,去年12月底的时候照着大佬的文章在Ubuntu20.04上装了Synopsys的工具。文章链接。 然而用文章里提到的工具生成的license有效期只能到2020年。 查了很多网上的资料,有...
  • lattice diamond 无限制license

    千次下载 热门讨论 2013-07-15 23:04:45
    lattice diamond 的license 没有网卡限制
  • Linux系统下安装Vivado成功导入license,但是view license status里又找不到license 这是由于安装时,输入的命令是sudo .xsetup,导致在vivado license manager中load license时显示导入成功,其实导入进去的目录是/...
  • 各种License

    千次阅读 2015-08-19 19:34:40
    什么是License 许多混乱就始于你不知道License到底是什么,到底有什么含义。当你对你的产品使用License时,并不意味着你放弃了任何权利,你依然对其拥有原著作权。License只是授予他们于特定权利来使用你的产品。...
  • MIT License

    2016-07-15 09:40:00
    MIT License 早上看到微软的UWP例子,在代码里看到 Copyright (c) Microsoft. All rights reserved.// This code is licensed under the MIT License (MIT).// THIS CODE IS PROVIDED *AS IS* WITHOUT ...
  • codewarrior破解license

    热门讨论 2012-08-30 19:15:00
    codewarrior破解license
  • arcgis license server许可管理器启动未响应或无法启动解决办法 来源url:http://blog.az009.com/14915.html 一、问题描述 在安装arcgis10.0 10.1 10.2 10.3 10.4 10.5 10.6等各版本软件时经常会出现arcgis ...
  • license生成工具

    2020-10-15 15:57:28
    license生成工具 根据 mac地址,生产验证码已经license文件 package com.datacvg.util; import cn.hutool.crypto.symmetric.AES; import cn.hutool.crypto.symmetric.DES; import com.google.gson.Gson; import ...
  • IDEA2018 license server激活方式

    万次阅读 热门讨论 2018-06-01 10:11:18
    Register,然后选择license server,网上搜索一下 IDEA2018 license server,找一个可用的地址即可。附以下 license server在写文章时亲测可用:...
  • 准备一台已经安装好License server的计算机 请准备有效的License授权文件。 操作步骤: 首先,在已经安装好License的服务器上点击开始,所有程序,选择citrix中的许可证管理控制台,如图: 打开许可证管理器...
  • 将crack文件夹下license_standalone.dat复制到matlab安装目录licenses文件夹下,并改名为license.dat。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,263
精华内容 44,505
热门标签
关键字:

license